设为首页 收藏本站
查看: 714|回复: 0

[经验分享] Nginx平滑升级和平滑重启

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-2 10:37:38 | 显示全部楼层 |阅读模式
    如果要对当前的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

1
2
3
4
5
6
[iyunv@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/
[iyunv@c7node1 ~]# ss -tnl
LISTEN     0      12                 *:80                             *:*




        这里为了测试升级过程中Web没有中断,提供一个脚本让其每秒去请求页面服务。并纪录到日志中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[iyunv@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文件中

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

[iyunv@c7node1 test]# crontab -e
* * * * * /bin/bash /test/cron.sh
#定义每分钟执行cron.sh任务





        下载编译nginx-1.9.6,并进行平滑升级,为了实现Nginx服务器的平滑升级,新的服务安装路径应该和旧的服务安装路径保持一致。如果因为某种原因不一致,需要把旧的服务的安装路径更改为新的服务的安装路径,修改方法为(nginx -p NewInstallPath)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[iyunv@c7node1 ~]# wget http://nginx.org/download/nginx-1.9.6.tar.gz
[iyunv@c7node1 ~]# tar xf nginx-1.9.6.tar.gz
[iyunv@c7node1 ~]# cd nginx-1.9.6
[iyunv@c7node1 nginx-1.9.6]# ./configure --prefix=/nginx/
[iyunv@c7node1 nginx-1.9.6]# make
[iyunv@c7node1 mv /nginx/sbin/nginx{,.bak}
#这里备份旧的nginx,一方面是等一下需要把新的nginx复制过来,另一方面的如果新的nginx有问题,还可以进行恢复
[iyunv@c7node1 nginx-1.9.6]# cp objs/nginx /nginx/sbin/
#把编译好的新的nginx文件服务到指定的安装目录中
[iyunv@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检测配置文件是否正常
[iyunv@c7node1 nginx-1.9.6]# kill -USR2 `cat /nginx/logs/nginx.pid`
#使用新版本的Nginx文件启动服务,之后平缓停止原有Nginx进程
[iyunv@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
[iyunv@c7node1 logs]# kill -WINCH `cat /nginx/logs/nginx.pid.oldbin`
#平缓停止旧服务的worker process
[iyunv@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/

[iyunv@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进程





测试结果
1
2
3
[iyunv@c7node1 ~]# sort /tmp/ping.http | uniq -c
  32822 Success.200
#可以看到服务并没有中止





        此部分内容参考《Nginx 高性能web服务器详解》   
快速停止Nginx服务:快速停止是指立即停止当前Nginx服务正在处理的所有网络请求,马上丢弃连接,停止工作
1
2
[iyunv@c7node1 ~]# kill -TERM `cat /nginx/logs/nginx.pid`
[iyunv@c7node1 ~]# kill -INT `cat /nginx/logs/nginx.pid`




平缓停止Nginx服务:平缓停止是指允许Nginx服务将当前正在处理的网络请求处理完成,但不再接受新的请求,之后关闭连接,停止工作
1
[iyunv@c7node1 ~]# kill -QUIT `cat /nginx/logs/nginx.pid`




平缓重启Nginx服务:Nginx服务进程接受到信号后,首先读取新的Nginx配置文件,如果配置语法正确,则启动新的Nginx服务,然后平缓关闭旧的服务进程,如果新的Nginx配置文件有问题,将显示错误,仍然使用旧的Nginx进程提供服务
1
[iyunv@c7node1 ~]# kill -HUP `cat /nginx/logs/nginx.pid`




日志切割:重新打开日志文件,常用于日志切割
1
[iyunv@c7node1 ~]# kill -USR1 `cat /nginx/logs/nginx.pid`




平缓升级Nginx服务:使用新版本的Nginx文件启动服务,之后平缓停止原有的Nginx进程
1
[iyunv@c7node1 ~]# kill -USR2 `cat /nginx/logs/nginx.pid`




平缓停止worker process:用于Nginx服务平缓升级
1
[iyunv@c7node1 ~]# kill -WINCH `cat /nginx/logs/nginx.pid`



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-133965-1-1.html 上篇帖子: nginx的502错误 下篇帖子: nginx和keepalive共存亡
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表