文章目录
- 4. Nginx 热部署
- 4.1.检查当前所用的nginx版本
- 4.2 检查旧的二进制命令编译参数
- 4.3 备份当前 nginx 二进制命令
- 4.4 下载一个新版本
- 4.5 编译安装
- 4.6 检查新安装的 nginx
- 4.7 检查当前 nginx 运行状态
- 4.8 停止旧版本
- 4.9 再次查看新的 nginx 状态
- 4.10 退出旧版本 master
- 4.11 再次查看 nginx 状态
- 4.12 删除旧进程
4. Nginx 热部署
特点:
1)在不重启或者关闭进程的情况下,使用新的应用直接替换旧的应用
例如:更换 nginx 的二进制命令版本(即升级或者降级 nginx 版本)
2)在不影响用户体验的情况下,进行版本升级或者降级,不主动 kill worker,就能够更换软件的二进制命令
4.1.检查当前所用的nginx版本
# 热部署流程
[root@nginx ~]# nginx -v
nginx version: nginx/1.20.2
4.2 检查旧的二进制命令编译参数
# 要保证新的二进制命令模块和旧的一样,不然更换版本之后如果不一致则很多模块不能使用
[root@nginx ~]# nginx -V # 这里是 大写的 V
nginx version: nginx/1.20.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments:
4.3 备份当前 nginx 二进制命令
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx-1202
4.4 下载一个新版本
wget http://nginx.org/download/nginx-1.18.0.tar.gz
# 解压缩
tar -zxvf nginx-1.18.0.tar.gz
4.5 编译安装
cd nginx-1.18.0
./configure # 注意这里要和之前版本编译的命令参数一致,默认安装则不用参数
make
make install
4.6 检查新安装的 nginx
# 这时就有两个版本的 nginx 命令
[root@nginx nginx-1.18.0]# ls /usr/local/nginx/sbin/
nginx nginx-1202
[root@nginx sbin]# nginx -v
nginx version: nginx/1.18.0
[root@nginx sbin]# nginx-1202 -v
nginx version: nginx/1.20.2
4.7 检查当前 nginx 运行状态
[root@nginx sbin]# ps -ef | grep nginx
root 5447 1 0 08:49 ? 00:00:00 nginx: master process ./nginx
nobody 8687 5447 0 12:25 ? 00:00:00 nginx: worker process
root 11447 8833 0 15:26 pts/0 00:00:00 grep --color=auto nginx
4.8 停止旧版本
# 此时发送一个 USR2 信号给旧的 master process,作用是使得 nginx 旧的版本停止接受用户请求,并且切换成新的 nginx 版本
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid `
# 当执行完毕上述命令,旧的 master process,首先会重命名它的 pid 文件,添加上.oldbin后缀;
[root@nginx ~]# ls /usr/local/nginx/logs/
access.log error.log nginx.pid nginx.pid.oldbin
# 然后再自动启动一个新的 master 主进程,以及 worker,使用的是新版本的 nginx 二进制文件
# 此时新的 nginx 就能够自动接受用户发来的请求,过度到新的 nginx-worker 进程上
4.9 再次查看新的 nginx 状态
[root@nginx ~]# ps -ef | grep nginx
root 5447 1 0 08:49 ? 00:00:00 nginx: master process ./nginx
nobody 8687 5447 0 12:25 ? 00:00:00 nginx: worker process
root 11455 5447 0 15:31 ? 00:00:00 nginx: master process ./nginx # 这里新的 nginx 进程,它的父进程 id 就是之前旧的 nginx 的进程 id
nobody 11456 11455 0 15:31 ? 00:00:00 nginx: worker process
root 11458 8833 0 15:31 pts/0 00:00:00 grep --color=auto nginx
4.10 退出旧版本 master
# 发送 WINCH 信号给旧的 master 进程,让旧的 master 进程优雅的退出
kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin `
4.11 再次查看 nginx 状态
[root@nginx ~]# ps -ef | grep nginx
# 这时候旧的 nginx 下就没有 worker 进程了,旧的 master 不会自己退出,当新的 master 有问题时,可以直接回滚到旧的 master 上使用
root 5447 1 0 08:49 ? 00:00:00 nginx: master process ./nginx
root 11455 5447 0 15:31 ? 00:00:00 nginx: master process ./nginx
nobody 11456 11455 0 15:31 ? 00:00:00 nginx: worker process
root 11465 8833 0 15:41 pts/0 00:00:00 grep --color=auto nginx
如果出现发送kill -USR2信号后,未出现新的master进程
是因为:旧的nginx必须用绝对路径启动,然后再发送USR2信号
4.12 删除旧进程
# 使用一段时间之后如果觉得 nginx 服务一切正常,就可以 kill 旧的 master主进程了
kill -9 `cat /usr/local/nginx/logs/nginx.pid.oldbin `
[root@nginx ~]# ps -ef | grep nginx
root 11455 1 0 15:31 ? 00:00:00 nginx: master process ./nginx
nobody 11456 11455 0 15:31 ? 00:00:00 nginx: worker process
root 11471 8833 0 15:44 pts/0 00:00:00 grep --color=auto nginx