原有的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%,循序渐进,最终把全部流量切到新主机。
最后,服务迁移繁琐复杂,容器化会是一个更好的选择。
![](https://i-blog.csdnimg.cn/blog_migrate/62ba8173803a1ce03ebb733bcd0f42d2.gif)