不关闭服务平滑升级 nginx 程序
老版本的 centos6 使用System V 脚本启动程序,centos7 使用Sytemd 服务单元启动服务。
本文介绍直接使用命令行工具平滑升级nginx,所谓平滑升级就是不中断服务,把nginx旧版程序替换为新版程序。
开始前我们需要编译好新版本的nginx 。可能是处于种种原因:升级版本、打开原来没打开的参数等等,都会重新编译程序。
新版本的 nginx 程序位于 /usr/local/src/nginx-1.18.0/objs/nginx 。
当前运行的 nginx 位于 /usr/local/nginx/sbin/nginx 。
1 2 3 |
cd /usr/local/nginx/sbin/ [root@VM_0_16_centos sbin]# ls nginx |
备份旧版程序,以防出现问题时能有退路,这是一个无论做什么都要养成的好习惯。动手之前摸清楚环境,做好现场保护,不然不能轻易动手。
1 |
[root@VM_0_16_centos sbin]# cp nginx nginx1.6 |
删除nginx文件
1 2 |
[root@VM_0_16_centos sbin]# rm nginx rm:是否删除普通文件 "nginx"?y |
拷贝新程序到 /usr/local/nginx/sbin/
1 |
[root@VM_0_16_centos sbin]# cp /usr/local/src/nginx-1.18.0/objs/nginx ./ |
查看旧版程序的进程号,老程序的主进程的进程号是28430:
1 2 3 4 5 6 7 |
[root@VM_0_16_centos sbin]# ps -ef|grep nginx www 5451 24830 0 4月23 ? 00:03:38 nginx: worker process www 5452 24830 0 4月23 ? 00:05:00 nginx: worker process www 5454 24830 0 4月23 ? 00:09:28 nginx: worker process www 5455 24830 0 4月23 ? 00:06:35 nginx: worker process root 24485 1831 0 17:53 pts/0 00:00:00 grep --color=auto nginx root 24830 1 0 2月15 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf |
发送 USR2 (kill -USR2 pid)信号给主进程。主进程将重命名它的 .pid 文件为 .oldbin ,然后执行新的可执行程序,依次启动新的主进程和新的工作进程,新进程的主程序进程号是24690:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@VM_0_16_centos sbin]# kill -USR2 24830 [root@VM_0_16_centos sbin]# ps -ef|grep nginx www 5451 24830 0 4月23 ? 00:03:38 nginx: worker process www 5452 24830 0 4月23 ? 00:05:00 nginx: worker process www 5454 24830 0 4月23 ? 00:09:28 nginx: worker process www 5455 24830 0 4月23 ? 00:06:35 nginx: worker process root 24690 24830 0 17:54 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf www 24691 24690 0 17:54 ? 00:00:00 nginx: worker process www 24692 24690 0 17:54 ? 00:00:00 nginx: worker process www 24693 24690 0 17:54 ? 00:00:00 nginx: worker process www 24694 24690 0 17:54 ? 00:00:00 nginx: worker process root 24714 1831 0 17:54 pts/0 00:00:00 grep --color=auto nginx root 24830 1 0 2月15 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf |
发送 WINCH 信号给旧的主进程24830,然后,它的工作进程就将开始从容关闭。
1 2 3 4 5 6 7 8 9 |
[root@VM_0_16_centos sbin]# kill -WINCH 24830 [root@VM_0_16_centos sbin]# ps -ef|grep nginx root 24690 24830 0 17:54 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf www 24691 24690 0 17:54 ? 00:00:00 nginx: worker process www 24692 24690 0 17:54 ? 00:00:00 nginx: worker process www 24693 24690 0 17:54 ? 00:00:00 nginx: worker process www 24694 24690 0 17:54 ? 00:00:00 nginx: worker process root 24830 1 0 2月15 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf root 24941 1831 0 17:56 pts/0 00:00:00 grep --color=auto nginx |
旧的工作进程处理了所有已连接的请求后退出,就仅由新的工作进程来处理输入的请求,只剩旧程序的master进程
1 2 3 4 5 6 7 8 |
[root@VM_0_16_centos sbin]# ps -ef|grep nginx root 24690 24830 0 17:54 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf www 24691 24690 0 17:54 ? 00:00:00 nginx: worker process www 24692 24690 0 17:54 ? 00:00:00 nginx: worker process www 24693 24690 0 17:54 ? 00:00:00 nginx: worker process www 24694 24690 0 17:54 ? 00:00:00 nginx: worker process root 24830 1 0 2月15 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf root 24987 1831 0 17:56 pts/0 00:00:00 grep --color=auto nginx |
发送 QUIT 信号给旧的主进程使其退出而只留下新的服务器运行
1 2 3 4 5 6 7 8 |
[root@VM_0_16_centos sbin]# kill -QUIT 24830 [root@VM_0_16_centos sbin]# ps -ef|grep nginx root 24690 1 0 17:54 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf www 24691 24690 0 17:54 ? 00:00:00 nginx: worker process www 24692 24690 0 17:54 ? 00:00:00 nginx: worker process www 24693 24690 0 17:54 ? 00:00:00 nginx: worker process www 24694 24690 0 17:54 ? 00:00:00 nginx: worker process root 25266 1831 0 17:57 pts/0 00:00:00 grep --color=auto nginx |