如果要对当前的Nginx服务器进行版本升级,应用新模块,如果用户访问量比较大的时候,如果需要在不影响客户的情况下进行升级的话,这时候就得考虑平滑升级了。
平滑升级的过程,Nginx服务器接受到USR2信号后,首先将旧的nginx.pid文件添加后缀.oldbin,变为nginx.pid.oldbin文件,然后执行新版本的Nginx服务器的二进制的文件启动服务,这个时候需要提前将编译好的新版本的二进制实现复制到sbin文件夹中。如果新的服务启动成功,系统中将有新旧两个Nginx服务共同提供Web服务。之后,需要向旧的Nginx服务器进程发送WINCH信号,使旧的Nginx服务平滑停止,并删除nginx.pid.oldbin文件。在发送WINCH信号之前,如果发现有什么错误,可以随时停止新的Nginx服务。
这里之前已经编译安装了naginx1.8.0。编译的时候只指定了按照路径 --prefix=/nginx/。这里演示从nginx1.8.0升级到nginx 1.9.6
[root@c7node1 ~]# /nginx/sbin/nginx -V nginx version: nginx/1.8.0 built by gcc 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) configure arguments: --prefix=/nginx/ [root@c7node1 ~]# ss -tnl LISTEN 0 12 *:80 *:*
这里为了测试升级过程中Web没有中断,提供一个脚本让其每秒去请求页面服务。并纪录到日志中
[root@c7node1 test]# vim http.sh #!/bin/bash # URL="http://192.168.0.66/" HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"` if [ $HTTP_CODE == 200 ];then echo Success.$HTTP_CODE >> /tmp/ping.http else echo Failure.404 >> /tmp/ping.http fi #请求http服务,把请求成功和失败发送到ping.http文件中 [root@c7node1 test]# vim cron.sh #!/bin/bash # while true;do /test/http.sh sleep 1 done #为cron服务提供每秒执行服务 [root@c7node1 test]# crontab -e * * * * * /bin/bash /test/cron.sh #定义每分钟执行cron.sh任务
下载编译nginx-1.9.6,并进行平滑升级,为了实现Nginx服务器的平滑升级,新的服务安装路径应该和旧的服务安装路径保持一致。如果因为某种原因不一致,需要把旧的服务的安装路径更改为新的服务的安装路径,修改方法为(nginx -p NewInstallPath)
[root@c7node1 ~]# wget http://nginx.org/download/nginx-1.9.6.tar.gz [root@c7node1 ~]# tar xf nginx-1.9.6.tar.gz [root@c7node1 ~]# cd nginx-1.9.6 [root@c7node1 nginx-1.9.6]# ./configure --prefix=/nginx/ [root@c7node1 nginx-1.9.6]# make [root@c7node1 mv /nginx/sbin/nginx{,.bak} #这里备份旧的nginx,一方面是等一下需要把新的nginx复制过来,另一方面的如果新的nginx有问题,还可以进行恢复 [root@c7node1 nginx-1.9.6]# cp objs/nginx /nginx/sbin/ #把编译好的新的nginx文件服务到指定的安装目录中 [root@c7node1 sbin]# /nginx/sbin/nginx -t nginx: the configuration file /nginx//conf/nginx.conf syntax is ok nginx: configuration file /nginx//conf/nginx.conf test is successful #测试新编译的nginx检测配置文件是否正常 [root@c7node1 nginx-1.9.6]# kill -USR2 `cat /nginx/logs/nginx.pid` #使用新版本的Nginx文件启动服务,之后平缓停止原有Nginx进程 [root@c7node1 nginx-1.9.6]# cd /nginx/logs/ access.log error.log nginx.pid nginx.pid.oldbin #可以看到这里自动把之前的nginx.pid命名为nginx.pid.oldbin,并为新的nginx生成nginx.pid [root@c7node1 logs]# kill -WINCH `cat /nginx/logs/nginx.pid.oldbin` #平缓停止旧服务的worker process [root@c7node1 logs]# nginx -V nginx version: nginx/1.9.6 built by gcc 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) configure arguments: --prefix=/nginx/ [root@c7node1 logs]# ps -aux |grep nginx root 990 0.0 0.2 24316 1880 ? S 11:25 0:00 nginx: master process nginx nobody 992 0.9 0.2 24724 1712 ? S 11:25 0:03 nginx: worker process root 2357 0.0 0.1 24308 896 ? Ss 11:20 0:00 nginx: master process nginx #可以看到有两个master process进程
测试结果
[root@c7node1 ~]# sort /tmp/ping.http | uniq -c 32822 Success.200 #可以看到服务并没有中止
此部分内容参考《Nginx 高性能web服务器详解》
快速停止Nginx服务:快速停止是指立即停止当前Nginx服务正在处理的所有网络请求,马上丢弃连接,停止工作
[root@c7node1 ~]# kill -TERM `cat /nginx/logs/nginx.pid` [root@c7node1 ~]# kill -INT `cat /nginx/logs/nginx.pid`
平缓停止Nginx服务:平缓停止是指允许Nginx服务将当前正在处理的网络请求处理完成,但不再接受新的请求,之后关闭连接,停止工作
[root@c7node1 ~]# kill -QUIT `cat /nginx/logs/nginx.pid`
平缓重启Nginx服务:Nginx服务进程接受到信号后,首先读取新的Nginx配置文件,如果配置语法正确,则启动新的Nginx服务,然后平缓关闭旧的服务进程,如果新的Nginx配置文件有问题,将显示错误,仍然使用旧的Nginx进程提供服务
[root@c7node1 ~]# kill -HUP `cat /nginx/logs/nginx.pid`
日志切割:重新打开日志文件,常用于日志切割
[root@c7node1 ~]# kill -USR1 `cat /nginx/logs/nginx.pid`
平缓升级Nginx服务:使用新版本的Nginx文件启动服务,之后平缓停止原有的Nginx进程
[root@c7node1 ~]# kill -USR2 `cat /nginx/logs/nginx.pid`
平缓停止worker process:用于Nginx服务平缓升级
[root@c7node1 ~]# kill -WINCH `cat /nginx/logs/nginx.pid`