原有的Node服務,需要遷移到新的主機上,故需要準備一套新的環境,以及對應的遷移方案。
Node安裝
手動安裝
下載地址: https://nodejs.org/en/download/
選擇:Linux Binaries (x64) 右鍵複製下載鏈接
# 下載到機器上,放在/opt目錄
[work@40-14-22 opt]$ wget https://nodejs.org/dist/v12.16.2/node-v12.16.2-linux-x64.tar.xz
# 解壓
[work@40-14-22 opt]$ tar -xvf node-v12.16.2-linux-x64.tar.xz
# 重命名
[work@40-14-22 opt]$ mv node-v12.16.2-linux-x64 nodejs
# 添加軟鏈讓node、npm命令能夠全局訪問(需要 ROOT權限)
[root@40-14-22 opt]# ln -s /opt/nodejs/bin/node /usr/local/bin/
[root@40-14-22 opt]# node -v
v12.16.2
[root@40-14-22 opt]# ln -s /opt/nodejs/bin/npm /usr/local/bin/
[root@40-14-22 opt]# npm -v
6.14.4
使用NVM安裝
# 安裝NVM:https://github.com/nvm-sh/nvm
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
# 安裝Node
nvm install v12.16.3
使用NVM的好處在於可以管理Node版本,同一機器上可靈活切換不同Node版本,一鍵安裝較方便
NVM常用命令
nvm install v12.16.3
:安裝指定版本的Nodenvm use v12.16.2
:使用指定版本的Nodenvm ls
: 查看當前使用的Node版本nvm -h
: 查看幫助文檔
運行環境準備
安裝PM2
# 全局安裝
[root@40-14-22 opt]# npm install pm2 -g
# 如果不支持全局使用,需配置軟鏈
[root@40-14-22 bin]# ln -s /opt/nodejs/lib/node_modules/pm2/bin/pm2 /usr/local/bin/
日誌分割
官方文檔:https://www.npmjs.com/package/pm2-logrotate
# 安裝pm2-logrotate
[work@40-14-22 log]$ pm2 install pm2-logrotate
# 設置超過1G分割
pm2 set pm2-logrotate:max_size 1G
# 設置最多保存200個日誌文件
pm2 set pm2-logrotate:retain 200
# 是否通過gzip壓縮日誌
pm2 set pm2-logrotate:compress false
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
pm2 set pm2-logrotate:workerInterval 30
# 每天晚上23:59:30分割
pm2 set pm2-logrotate:rotateInterval '30 59 23 * * *'
pm2 set pm2-logrotate:rotateModule true
設置完成後可以通過pm2 conf pm2-logrotate
查看設置的是否正確
[work@40-14-22 .pm2]$ pm2 conf pm2-logrotate
Module: pm2-logrotate
$ pm2 set pm2-logrotate:max_size 1G
$ pm2 set pm2-logrotate:retain 200
$ pm2 set pm2-logrotate:compress false
$ pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
$ pm2 set pm2-logrotate:workerInterval 30
$ pm2 set pm2-logrotate:rotateInterval 0 0 * * *
$ pm2 set pm2-logrotate:rotateModule true
Module: module-db-v2
$ pm2 set module-db-v2:pm2-logrotate [object Object]
安裝Git
安裝git是爲了讓pm2部署時能夠從倉庫中拉取代碼,並部署
安裝
[root@40-14-22 ~]# yum install git
配置公鑰
拷貝機器的公鑰串(當前用戶的.ssh目錄下的.pub文件內容),粘貼到公共的gitlab下的授權下即可;目的是允許機器拉取gitlab倉庫中的私有代碼
# 生成公鑰-一直回車即可
[work@40-14-22 .ssh]$ ssh-keygen -t rsa
最好使用公共賬號,不要使用個人賬號
如不配置ssh,pm2拉代碼的時候會提示如下無權限錯誤
服務器授信
部署機與服務器
目的: 部署機可免密訪問目標機
編輯目標機.ssh
目錄下的authorized_keys
文件,粘貼保存部署機上.ssh
目錄下.pub
文件內容即可
vim快捷鍵:https://www.cnblogs.com/junwen5599/p/9996873.html
服務器與Gitlab服務器
向服務器的known_hosts
中新增Gitlab服務器的公鑰
缺少配置在部署時會報如下錯誤
其他
查看Linux內核版本
[work@37-14-42 log]$ uname -a
Linux 37-14-42 2.6.32-573.22.1.el6.x86_64 #1 SMP Wed Mar 23 03:35:39 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
查看centos版本
[work@37-14-42 log]$ cat /etc/redhat-release
CentOS release 6.5 (Final)
在centos6上安裝最新的Node12會報如下錯誤
[work@40-31-60 ~]$ node -v
node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by node)
node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by node)
node: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.5' not found (required by node)
node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.16' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by node)
原因爲gcc版本過低,要麼升級gcc,要麼系統升級到centos7
建議不要折騰,在centos6上升級gcc版本,耗力費時,可能還會存在版本匹配問題;最好選擇一步到位升級系統到centos7
遷移方案
測試驗證
服務器環境準備好後,接下來就是按照線上的部署流程在新服務器上部署Node服務。
此時,由於沒有經過驗證,不能夠直接讓外網流量進來;另外,線上服務環境與公司內網環境一般也是隔離的,那麼如何才能請求到新的服務驗證新服務是否可用呢?
這種情況,可以藉助部署機,部署機比較特殊,既可以訪問內網的gitlab服務拉取代碼,又可以把拉取到的代碼部署到線上環境,可以部署機爲跳板訪問線上新的Node服務,在內網環境驗證服務是否可用。
具體可參見這篇文章:通過Nginx解決網絡隔離實踐記錄
切流量
當驗證完服務正常後,接下來就是切流量操作了,可以採用如下兩種方案
- 把線上某一臺機器的流量切到新服務上
- 把線上流量的10%切到新的服務上
流量進來後,觀察服務器的各項參數是否有異常,觀察Node服務的日誌監控是否有異常上報。
運行一段時間無異常,再切50%,循序漸進,最終把全部流量切到新主機。
最後,服務遷移繁瑣複雜,容器化會是一個更好的選擇。