最近在幫別人做微信小程序瞻惋,需要一臺服務(wù)器做后端厦滤,正好騰訊云有優(yōu)惠,并且跟小程序都是一家子歼狼,所以選用了騰訊云服務(wù)器(CVM)
前言
微信小程序服務(wù)目標人群固定掏导,短期內(nèi)訪問量不是很大,預測瞬時最高并發(fā)量120左右羽峰,所以云服務(wù)器選擇了一款面向開發(fā)者的屘伺兀惠套餐,1核/2G內(nèi)存/1Mbps帶寬/50G存儲梅屉,操作系統(tǒng)CentOS7.6值纱。完成在線實驗任務(wù),可升級到4G內(nèi)存坯汤,完成Web業(yè)務(wù)驗證任務(wù)虐唠,可升級到2M帶寬。另外還有邀請好友免費續(xù)費活動惰聂,這個可能就比較難完成了疆偿。
小程序后端開發(fā)的是Java Web應用,在tomcat上運行搓幌,數(shù)據(jù)庫選用PostgreSQL翁脆,并安裝PostGIS插件用于地理位置計算。使用Nginx做代理鼻种,一是可以反向代理到tomcat反番,并且可配置負載均衡,二是可以直接代理靜態(tài)資源文件叉钥。
所以羅列了一下需要安裝及配置的內(nèi)容:
1罢缸、JDK
2、Tomcat
3投队、PostgreSQL
4枫疆、PostGIS
5、Nginx
另外敷鸦,微信小程序要求后端服務(wù)器必須通過htpps域名訪問息楔,并且必須ICP備案,所以域名申請和解析扒披,ssl證書的申請值依,ICP備案這些都是必須的。索性騰訊云這方面的服務(wù)比較到位碟案,去相應的頁面操作即可愿险,這里就不詳述了。(備案周期比較長价说,建議域名申請后立即做備案辆亏,因為備案的時候根本不關(guān)心你的網(wǎng)站做沒做好风秤,有什么內(nèi)容,而且備案時明確要求暫桶邕叮或關(guān)閉域名解析的)
如果本地電腦系統(tǒng)是Windows缤弦,建議使用WinSCP軟件連接云服務(wù)器,上傳/下載文件很方便彻磁。
下面主要闡述一下服務(wù)器環(huán)境的搭建步驟及方法甸鸟。
JDK的安裝
選用yum的方式安裝jdk比較簡單方便,不需要配置環(huán)境變量兵迅,至少本人親測沒問題,搭配tomcat啟動Web應用服務(wù)一切正常薪贫。
- 查找jdk版本恍箭。
yum search java|grep jdk
- 選擇適合的版本進行安裝(本例選擇1.8版)。
yum install -y java-1.8.0-openjdk
- 驗證瞧省,出現(xiàn)下圖即算完成扯夭。
java -version
- 如果想配置環(huán)境變量,建議把devel一起安裝鞍匾。
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
- JDK默認安裝路徑/usr/lib/jvm交洗,安裝完成后該目錄下應該有如下圖所示的內(nèi)容。
- 配置環(huán)境變量橡淑,在/etc/profile文件尾部添加如下代碼构拳。(如果不熟悉VI,比如我梁棠,建議使用WinSCP將profile文件下載到本地編輯后再上傳)
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME CLASSPATH PATH
- 保存后執(zhí)行
source /etc/profile
Tomcat的安裝
- 添加用戶組置森。
groupadd tomcat
- 添加一個用戶tomcat 并分配到組tomcat,設(shè)置其home目錄為/home/tomcat符糊,并且這個用戶為非登錄用戶凫海。
useradd -s /bin/nologin -g tomcat -d /home/tomcat tomcat
- 進入https://tomcat.apache.org/download-90.cgi頁面,選擇Binary Distributions(二進制發(fā)行版)下的Core(核心)下的tar.gz的壓縮文件男娄,復制其下載地址行贪,用
wget
命令在CentOS終端下載。
wget -c http://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.29/bin/apache-tomcat-9.0.29.tar.gz
- 把下載的內(nèi)容解壓到 /home/tomcat 里模闲。
tar -zxvf apache-tomcat-9.0.29.tar.gz -C /home/tomcat --strip-components 1
-C 選項的作用是:指定需要解壓到的目錄建瘫。
--strip-components 1 提取下一級目錄。
- 為 /home/tomcat/bin/catalina.sh 生成鏈接尸折。
ln -s /home/tomcat/bin/catalina.sh /etc/init.d/tomcat
- 編輯 /etc/profile 將 /home/tomcat 目錄添加到環(huán)境變量中夯尽。
export CATALINA_HOME=/home/tomcat
- 保存后執(zhí)行
source /etc/profile
- 把目錄/home/tomcat/的own權(quán)限分配置給tomcat組的tomcat用戶。
chown -R tomcat:tomcat /home/tomcat/
- 修改/home/tomcat/webapps/manager/META-INF/context.xml文件福稳,注釋掉其中的Valve標簽(非必須,如果想使用tomcat管理頁面需設(shè)置)晾咪。
- 修改/home/tomcat/conf/tomcat-users.xml,增加如下配置(非必須贮配,如果想使用tomcat管理頁面需設(shè)置)谍倦。
- 現(xiàn)在就可以通過/etc/init.d/tomcat 來啟動了,如下三種命令皆可泪勒,指定tomcat用戶來啟動昼蛀,防止tomcat刪除你整個硬盤里的東西(后一個-u參數(shù)一定要帶,不然java web應用程序啟動會報權(quán)限不足拒絕訪問的錯誤圆存,這是我遇到的一個很大的坑)
sudo -u tomcat /home/tomcat/bin/catalina.sh start -u -security
sudo -u tomcat /etc/init.d/tomcat start -u -security
sudo -u tomcat service tomcat start -u security
這里有個坑叼旋,CentOS非root用戶不能啟動1024以內(nèi)的端口,所以如果tomcat使用80沦辙、443這樣的端口夫植,則必須用root用戶啟動tomcat,不能使用上述的tomcat用戶啟動油讯,否則80详民、443不會被監(jiān)聽到。
換而言之陌兑,使用80沈跨、443端口,則上述安裝過程中創(chuàng)建tomcat用戶組/用戶等的步驟都可以不做兔综。
可以使用下述命令查看操作系統(tǒng)當前各端口的監(jiān)聽狀態(tài)饿凛。
netstat -tunlp
- 停止tomcat服務(wù)使用下面的命令
sh /home/tomcat/bin/shutdown.sh
- 監(jiān)控日志命令(Ctrl+C退出,實時監(jiān)控可以用這個命令软驰,如果想看得更全還是下載下來更好)
tail -f /home/tomcat/logs/catalina.out
- tomcat啟動后笤喳,可以通過下面的命令來查看tomcat監(jiān)聽的端口,一般是8009:與其它http集成可能用到的端口碌宴;8080:web訪問端口杀狡;8005:監(jiān)聽關(guān)閉tomcat的端口。
netstat -napt |grep java |grep LISTEN
- ssl的配置
1贰镣、將證書下載后解壓縮呜象,把其中tomcat文件夾下的 www.domain.com.jks 文件上傳到 /home/tomcat 目錄下;
2碑隆、修改 /homt/tomcat/conf/server.xml 文件:<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" /> <Connector port="443" protocol="HTTP/1.1" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" keystoreFile="www.domain.com.jks" keystorePass="40te94si4u5f20x" />
2.1恭陡、80端口的redirectPort修改成443,
2.2上煤、新添加443端口的設(shè)置休玩,其中keystoreFile的內(nèi)容是上傳的那個jks文件的文件名,可以是絕對路徑也可以是相對路徑,相對路徑是相對于CATALINA_HOME的路徑拴疤,keystorePass的內(nèi)容是證書解壓縮后tomcat目錄里keystorePass.txt文件的內(nèi)容永部;
3、重啟tomcat即可呐矾。
- Tomcat9簡單的安全設(shè)置
1苔埋、隱藏版本號
mkdir -p /home/tomcat/lib/org/apache/catalina/util
vi /home/tomcat/lib/org/apache/catalina/util/ServerInfo.properties 添加下面內(nèi)容
server.info=version
然后重啟tomcat就可以了
2、修改/home/tomcat/conf/server.xml 中<Server port="8005" shutdown="SHUTDOWN">這個配置中的port值及shutdown值蜒犯;port指定的是指定Tomcat監(jiān)聽shutdown命令端口组橄,shutdown指定終止Tomcat服務(wù)器運行時,發(fā)給Tomcat服務(wù)器的shutdown監(jiān)聽端口的字符串;為了安全起見罚随。不要使用默認值玉工;如修改成下面的內(nèi)容
<Server port="8303" shutdown="god_bless_me_have_no_longer_bug">
記住一定要在你沒有啟動tomcat的情況修改
3、在自己的web應該中盡量替換默認的404,403,500頁面
4淘菩、盡量在啟動腳本后加-security 增加安全管理遵班;如
/home/tomcat/bin/catalina.sh start -security
5、盡量不要用root用戶啟動tomcat(對于想用80瞄勾、443端口,則必須root啟動)
- 關(guān)于tomcat正常啟動后弥激,網(wǎng)站無法訪問的排查辦法进陡。
1、確認域名解析是否正確微服;
2趾疚、安全組設(shè)置是否正確(要開放tomcat中設(shè)置的訪問監(jiān)聽端口)。
3以蕴、確認端口是否被監(jiān)聽(非root用戶啟動tomcat后糙麦,80、443等端口就不會被監(jiān)聽)丛肮;
4赡磅、確認網(wǎng)站是否完成ICP備案(不備案80、443端口無法訪問宝与,但用ip地址可以)焚廊。
重要的事情我只說一遍,上述第三和第四點是我遇到的最大的坑习劫。
- tomcat項目部署的三種方式:
1咆瘟、直接把項目復制到Tomcat安裝目錄的webapps目錄中,這是最簡單的一種Tomcat項目部署的方法诽里,缺點是只能通過 http://www.domain.com/項目目錄名 訪問袒餐。
2、修改/home/tomcat/conf/server.xml,在<host>和</host>之間加入如下代碼<Context docBase="newwebapp" path="/nwa" debug="0" reloadable="true" />
此時可以通過http://www.domain.com/nwa 訪問灸眼,docBase是項目路徑卧檐,可以是絕對路徑,也可以是相對于Host中的appBase設(shè)置的目錄的相對路徑幢炸;path是訪問路徑泄隔,如果想讓域名直接訪問該項目,則path設(shè)置成"/"即可宛徊。
3佛嬉、在 /home/tomcat/conf/Catalina/localhost 下新建一個nwa.xml文件(文件名即是訪問路徑,如果跟內(nèi)容中的path不一致闸天,tomcat還是會以文件名作為訪問路徑的暖呕,所以感覺Context里的path沒什么用),編輯內(nèi)容如下:<Context path="/nwa" docBase="newwebapp" debug="0" privileged="true" />
第二和第三種方法比較靈活苞氮。第三種方式如果想設(shè)置成根目錄訪問湾揽,則xml文件名必須叫ROOT.xml。
- 如果應用中有圖片/文件上傳功能笼吟,記得這幾個方面需要考慮到:
1库物、Tomcat 以 tomcat 用戶身份啟動時,保存上傳資源的目錄一定要對tomcat賦予足夠的操作權(quán)限贷帮。
chown -R tomcat:tomcat /home/webapps/
2戚揭、修改 Tomcat 安裝根目錄下的 /bin/catalina.sh 文件,將下面的代碼普片段中的 UMASK 的值 0027 改成 0022 撵枢,否則上傳成功后民晒,nginx 無法訪問(不用nginx直接代理該資源文件時這個可以不設(shè)置)。
# Set UMASK unless it has been overridden if [ -z "$UMASK" ]; then UMASK="0027" fi umask $UMASK
3锄禽、nginx 默認允許客戶端請求數(shù)據(jù)大小是1M潜必,如果允許上傳文件大小大于該數(shù)值,記得修改 nginx 的改項配置沃但,否則請求在 nginx 這一層就會被攔下磁滚。
client_max_body_size 20M;
PostgreSQL
- 在官網(wǎng)(https://www.postgresql.org/download/linux/redhat/)選擇數(shù)據(jù)庫版本,操作系統(tǒng)版本等信息后宵晚,頁面會自動生成安裝各步驟的命令恨旱,照此安裝即可。
- 上述步驟完成后坝疼,默認會創(chuàng)建一個名為postgres的linux登錄用戶搜贤,這里進行密碼修改。
passwd postgres
- 編輯 /var/lib/pgsql/12/data/postgresql.conf 文件的遠程連接信息钝凶,讓所有計算機能訪問到該測試數(shù)據(jù)庫仪芒;去掉下圖的#唁影,修改localhost為*后保存(vi命令:wq)。
- 同樣對 /var/lib/pgsql/12/data/pg_hba.conf 文件進行編輯掂名;追加下圖紅框內(nèi)的一行數(shù)據(jù)据沈,修改黃框的內(nèi)容后保存。
- 重啟服務(wù):
systemctl restart postgresql-12
- 用postgres賬號登錄centos服務(wù)器饺蔑,并修改數(shù)據(jù)庫用戶密碼(或者直接 su postgres 切換過去)
psql -U postgres
\password
用客戶端連接測試即可锌介。
PostgreSQL相關(guān)的補充:
1、別忘記安全組中開放5432端口猾警,即便該數(shù)據(jù)庫緊供同臺服務(wù)器上的web應用以localhost方式訪問孔祸,也需要開放5432端口,原因未知(懶得發(fā)工單問騰訊技術(shù)人員了发皿,之前tomcat的問題已經(jīng)被折磨瘋了)崔慧。
- 自動備份數(shù)據(jù)庫
在 /usr/pgsql-12/bin 目錄下面創(chuàng)建 backup.sh 文件,內(nèi)容如下:
#!/bin/bash
cur_time=$(date +%Y%m%d_%H_%M_%S);
/usr/pgsql-12/bin/pg_dump -h 127.0.0.1 -p 5432 -U postgres -F c -b -v -f /home/dbbackup/dbase_backup_$cur_time.dmp yourdbname;
同時創(chuàng)建目錄 /home/dbbackup 作為備份文件存放路徑穴墅。
啟動cron服務(wù):
# 查看服務(wù)狀態(tài)
systemctl status crond
# 啟動
systemctl start crond
# 停止
systemctl stop crond
# 重啟
systemctl restart crond
# 重新加載
systemctl reload crond
開機自動啟動cron服務(wù)
systemctl start crond.service
進入編輯模式
crontab -e
添加執(zhí)行 backup.sh 任務(wù)
#每天2:30分執(zhí)行
30 2 * * * /usr/pgsql-12/bin/backup.sh
保存退出
:wq
查看定時任務(wù)列表
crontab -l
查看定時任務(wù)執(zhí)行日志
cat /var/log/cron
PostGIS
因為需要在數(shù)據(jù)庫層面進行地理位置坐標之間的距離計算惶室,所以需要安裝PostgreSQL的一個相關(guān)的擴展PostGIS
查找合適的版本。
yum search postgis|grep postgis
- 因為之前安裝的PostgreSQL的版本是12玄货,所以選擇12版對應的最新版postgis皇钞,即postgis30_12.x86_64。
yum install postgis30_12.x86_64
- 如果安裝過程中出現(xiàn)缺少依賴包的問題松捉,可以先執(zhí)行下面語句安裝依賴包夹界。
rpm -ivh ftp://bo.mirror.garr.it/1/slc/centos/7.6.1810/extras/x86_64/Packages/epel-release-7-6.noarch.rpm
- 為始數(shù)據(jù)庫可用PostGIS,需在該數(shù)據(jù)庫上執(zhí)行下列語句惩坑,我是用pgAdmin連數(shù)據(jù)庫執(zhí)行的掉盅,這里有個坑也拜,該數(shù)據(jù)庫一定要有public這個shema以舒,因為要在public下創(chuàng)建一些表。
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_topology; # 這句不執(zhí)行對于我的業(yè)務(wù)來說沒影響慢哈,我只用距離計算這個功能蔓钟。
- 測試,能正確返回數(shù)據(jù)表示成功能卵贱。
select ST_distance(ST_GeomFromText('POINT(121.2309 39.1823)', 4326)::geography, ST_GeomFromText('POINT(121.2319 39.1811)', 4326)::geography);
Nginx
- 使用 yum 命令安裝 Nginx
yum install -y nginx
- 設(shè)置 Nginx 開機啟動
systemctl enable nginx.service
- 啟動Nginx
nginx
此時滥沫,訪問 http://主機ip地址 可以看到Nginx的默認頁。
配置文件 /etc/nginx/nginx.conf 里定義了80端口的默認配置键俱,可以直接修改該文件兰绣,也可以在 /etc/nginx/conf.d 目錄下新建 *.conf 文件進行自定義配置。我選擇后一種方式编振,這樣感覺更清晰些缀辩。
到 SSL 控制臺下載證書文件,將解壓縮后的 Nginx 文件夾下的兩個文件上傳至 /etc/nginx 目錄下,
新建 ssl.conf 文件臀玄,編輯好后上傳至 /etc/nginx/conf.d 目錄瓢阴,配置示例如下:
upstream tomcatweb {
server localhost:8443;
}
server {
listen 80;
server_name www.domain.com; # 改為綁定證書的域名
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
server {
listen 443 ssl;
server_name www.domain.com; # 改為綁定證書的域名
ssl_certificate 1_www.domain.com_bundle.crt; # 改為自己申請得到的 crt 文件的名稱
ssl_certificate_key 2_www.domain.com.key; # 改為自己申請得到的 key 文件的名稱
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
client_max_body_size 20M;
location / {
proxy_pass https://tomcatweb/yourapp/;
proxy_cookie_path /yourapp/ /;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /yourapp/ {
proxy_pass https://tomcatweb/yourapp/;
proxy_cookie_path /yourapp/ /;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /resource/ {
root /home/webapps/yourapp;
}
location /yourapp/resource/ {
root /home/webapps;
}
}
這個配置文件主要做了一下幾件事:
1、監(jiān)聽80端口健无,重定向到443端口荣恐;
2、監(jiān)聽443端口累贤,配置ssl證書叠穆,需要注意的是“ssl_certificate”和“ssl_certificate_key”這兩個設(shè)置,可以使用絕對路徑也可以使用相對路徑畦浓,若是相對路徑痹束,則是相對 /etc/nginx 目錄的路徑;
3讶请、/resource/ 下的文件都是靜態(tài)文件祷嘶,這里做了設(shè)置,nginx直接代理夺溢;
4论巍、上例中的靜態(tài)資源配置,如果訪問地址是 https://www.domain.com/resource/test.jpg 則nginx會按照配置找 /home/webapps/yourapp/resource/test.jpg 文件风响,注意這里是把root的值和location的值拼在一起嘉汰;
5、upstream 的配置状勤,將來如果是多Tomcat服務(wù)器的話鞋怀,直接在這里加新地址即可,可實現(xiàn)負載均衡持搜;
6密似、注意upstream配置的命名,如果帶下劃線葫盼,寫成tomcat_web残腌,跳轉(zhuǎn)到tomcat9時會報錯”java.lang.IllegalArgumentException: The character [_] is never valid in a domain",Tomcat7好像不會贫导,所以為了避免不必要的問題出現(xiàn)抛猫,這里就不要使用下劃線命名了;
7孩灯、proxy_pass 如果是設(shè)置到某個具體的應用下(比如上例)闺金,則最后一定要加“/”這個符號,不加會有問題峰档,至于為什么我沒調(diào)查败匹;
8匣距、像上例這樣反向代理到具體某個應用時,location /yourapp/ 這個一定要設(shè)置哎壳,不然應用內(nèi)不的相對路徑加載資源文件等會找不到(因為Nginx只設(shè)置跟路徑解析毅待,應用內(nèi)部相對路徑引用的文件地址會解析成www.domain.com/yourapp/yourapp/.)。
- 修改配置完成后归榕,重啟 nginx 服務(wù)
nginx -s reload
使用 https 協(xié)議訪問你的域名尸红, 如 https://www.domain.com 檢查是否成功,如果地址欄出現(xiàn)綠色帶
安全
字樣的鎖頭標志刹泄,說明 SSL 配置成功外里。補充一點,有一次重啟系統(tǒng)后特石,發(fā)現(xiàn)直接訪問 tomcat 正常盅蝗,但訪問 nginx 返回502錯誤,查看 nginx 錯誤日志文件姆蘸,發(fā)現(xiàn)報
connect() to [::1]:8080 failed (13: Permission denied) while connecting to upstream, client:
錯誤墩莫,解決方案是查看系統(tǒng) httpd 配置,
getsebool -a | grep httpd
設(shè)置httpd可以連接到網(wǎng)絡(luò)
setsebool httpd_can_network_connect on -P
寫在最后
整個安裝過程其實比較簡單逞敷,除了PostgreSQL耗時有點長狂秦,其它軟件安裝速度很快。
配置上則需要看具體需求了推捐,其實只使用Tomcat我覺得也完全可以裂问,但這次用Nginx+Tomcat,算是一種嘗試吧牛柒,主要考慮用Nginx實現(xiàn)動靜分離堪簿,至于負載均衡暫時還用不上。
另外Nginx+Tomcat的方式皮壁,我這次是兩邊都采用https協(xié)議椭更,其實也可以只Nginx實現(xiàn)https,而Tomcat仍舊使用http協(xié)議闪彼。
最后的最后甜孤,給新建網(wǎng)站的朋友一個建議协饲,一定要先申請域名做ICP備案畏腕,備案周期真的比較長,不要像我這樣萬事俱備苦等審核結(jié)果茉稠。
后期補充
運維過程中需求變更描馅,某個小程序頁面有使用WebSocket的應用場景,簡化開發(fā)及運維成本而线,選用Node.js構(gòu)建了WebSocket服務(wù)器铭污,接下來補充一下Node.js相關(guān)的環(huán)境搭建恋日。
Node.js
- 添加 Node.js Yum 存儲庫
yum clean all && yum makecache fast
yum install -y gcc-c++ make
curl -sL https://rpm.nodesource.com/setup_12.x | sudo -E bash -
- 安裝 Node.js (不進行上面的操作直接執(zhí)行安裝,只能安裝到6.x版本)
yum install nodejs -y
- 安裝 npm 包管理器
yum install npm -y
- 新建項目文件夾嘹狞,比如/home/webapps/yourapp
mkdir /home/webapps/yourapp
- 進入新建的文件夾
cd /home/webapps/yourapp
- 初始化環(huán)境岂膳,成功后會生成 package.json 文件
npm init -y
- 因使用到了 ws 和 pg 兩個第三方組件,所以需要順次安裝
npm install ws --save
npm install pg --save
將本地寫好的代碼文件上傳
運行
node index.js
- 后臺運行指令
/usr/bin/nohup /usr/bin/node /home/webapps/yourapp/index.js & >> /home/webapps/logs.txt
- 終止后臺運行
先查看一下node的進程號
ps -aux|grep node
或者根據(jù)端口號查詢
netstat -nap|grep 端口號
殺死進程
kill -9 進程號
- Nginx配置的修改
增加 upstream 的定義
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream nodews {
server localhost:3000;
}
增加location的定義
location /ws/ {
proxy_pass http://nodews/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
- 安全起見磅网,可以不對外暴露websocket監(jiān)聽的3000端口