文章目录

  • 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