浅见池也 发表于 2018-11-10 07:48:05

Nginx平滑升级和平滑重启

  如果要对当前的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
# /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/
  
# ss -tnl
  
LISTEN   0      12               *:80                           *:*
  这里为了测试升级过程中Web没有中断,提供一个脚本让其每秒去请求页面服务。并纪录到日志中
# 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文件中
  

  
# vim cron.sh
  
#!/bin/bash
  
#
  
while true;do
  
/test/http.sh
  
sleep 1
  
done
  
#为cron服务提供每秒执行服务
  

  
# crontab -e
  
* * * * * /bin/bash /test/cron.sh
  
#定义每分钟执行cron.sh任务
  下载编译nginx-1.9.6,并进行平滑升级,为了实现Nginx服务器的平滑升级,新的服务安装路径应该和旧的服务安装路径保持一致。如果因为某种原因不一致,需要把旧的服务的安装路径更改为新的服务的安装路径,修改方法为(nginx -p NewInstallPath)
# wget http://nginx.org/download/nginx-1.9.6.tar.gz  
# tar xf nginx-1.9.6.tar.gz
  
# cd nginx-1.9.6
  
# ./configure --prefix=/nginx/
  
# make
  
[root@c7node1 mv /nginx/sbin/nginx{,.bak}
  
#这里备份旧的nginx,一方面是等一下需要把新的nginx复制过来,另一方面的如果新的nginx有问题,还可以进行恢复
  
# cp objs/nginx /nginx/sbin/
  
#把编译好的新的nginx文件服务到指定的安装目录中
  
# /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检测配置文件是否正常
  
# kill -USR2 `cat /nginx/logs/nginx.pid`
  
#使用新版本的Nginx文件启动服务,之后平缓停止原有Nginx进程
  
# cd /nginx/logs/
  
access.logerror.lognginx.pidnginx.pid.oldbin
  
#可以看到这里自动把之前的nginx.pid命名为nginx.pid.oldbin,并为新的nginx生成nginx.pid
  
# kill -WINCH `cat /nginx/logs/nginx.pid.oldbin`
  
#平缓停止旧服务的worker process
  
# 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/
  

  
# ps -aux |grep nginx
  
root       9900.00.2243161880 ?      S    11:25   0:00 nginx: master process nginx
  
nobody   9920.90.2247241712 ?      S    11:25   0:03 nginx: worker process
  
root      23570.00.124308   896 ?      Ss   11:20   0:00 nginx: master process nginx
  
#可以看到有两个master process进程
  测试结果
# sort /tmp/ping.http | uniq -c  
32822 Success.200
  
#可以看到服务并没有中止
  此部分内容参考《Nginx 高性能web服务器详解》
  快速停止Nginx服务:快速停止是指立即停止当前Nginx服务正在处理的所有网络请求,马上丢弃连接,停止工作
# kill -TERM `cat /nginx/logs/nginx.pid`  
# kill -INT `cat /nginx/logs/nginx.pid`
  平缓停止Nginx服务:平缓停止是指允许Nginx服务将当前正在处理的网络请求处理完成,但不再接受新的请求,之后关闭连接,停止工作
# kill -QUIT `cat /nginx/logs/nginx.pid`  平缓重启Nginx服务:Nginx服务进程接受到信号后,首先读取新的Nginx配置文件,如果配置语法正确,则启动新的Nginx服务,然后平缓关闭旧的服务进程,如果新的Nginx配置文件有问题,将显示错误,仍然使用旧的Nginx进程提供服务
# kill -HUP `cat /nginx/logs/nginx.pid`  日志切割:重新打开日志文件,常用于日志切割
# kill -USR1 `cat /nginx/logs/nginx.pid`  平缓升级Nginx服务:使用新版本的Nginx文件启动服务,之后平缓停止原有的Nginx进程
# kill -USR2 `cat /nginx/logs/nginx.pid`  平缓停止worker process:用于Nginx服务平缓升级
# kill -WINCH `cat /nginx/logs/nginx.pid`

页: [1]
查看完整版本: Nginx平滑升级和平滑重启