nginx平滑升级和回滚-创新互联

平滑升级的作用:

有时候需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx 又在跑着业务无法停止,这时就可以选择平滑升级

成都创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站制作、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的鄠邑网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!平滑升级可以分为四个阶段:
  • 只有旧版nginx的master和worker进程
  • 旧版和新版nginx的master和worker进程并存,由旧版nginx接收处理用户的新请求(注意:做快照方 便测试回滚)
  • 旧版和新版nginx的master和worker进程并存,由新版nginx接收处理用户的新请求
  • 只有新版nginx的master和worker进程
基本流程:
  • 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
  • 向master进程发送USR2信号启动新nginx进程 master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin master进程用新Nginx文件启动新master进程及worker子进程成为旧master的子进程 系统中将有新旧两个Nginx主进程和对应的worker子进程并存 当前新的请求仍然由旧Nginx的worker进程进行处理 将新生成的master进程的PID存放至新生成的pid文件nginx.pid
  • 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止 当前新的请求由新Nginx的worker进程进行处理
  • 向旧master进程发送QUIT信号,关闭旧master,并删除Nginx.pid.oldbin文件
  • 如果发现升级有问题,可以回滚∶向旧master发送HUP,向新master发送QUIT
实战案例:

#本文旧版nginx为1.18.0,升级为1.20.1

#实验环境为centos7

一.平滑升级 1.下载压缩包并解压,切换到nginx-1.20.1目录下

[root@nginx ~]#wget http://nginx.org/download/nginx-1.20.1.tar.gz

[root@nginx ~]#tar xvf nginx-1.20.1.tar.gz

[root@nginx ~]#cd nginx-1.20.1

2.查看当前使用的nginx版本及编译参数信息

[root@nginx nginx-1.20.1]#/apps/nginx/sbin/nginx -V  

#版本

nginx version: nginx/1.18.0 built by gcc 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC) built with OpenSSL 1.1.1g FIPS  21 Apr 2020 TLS SNI support enabled

#编译参数

configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --withhttp_ssl_module --with-http_v2_module --with-http_realip_module --withhttp_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

3.开始编译新版本,参数使用上面一样的

[root@nginx nginx-1.20.1]#./configure --prefix=/apps/nginx --user=nginx -- group=nginx --with-http_ssl_module --with-http_v2_module --withhttp_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

4.只编译,不安装

[root@nginx nginx-1.20.1]#make

#这里是升级,只需make无需make install

5.验证版本信息是否正确

[root@nginx nginx-1.20.1]#objs/nginx -v

nginx version: nginx/1.20.1

6.备份旧版nginx的程序文件

[root@nginx nginx-1.20.1]#cp /apps/nginx/sbin/nginx /opt/nginx.old

7.用新版nginx的程序文件覆盖旧版的程序文件

[root@nginx nginx-1.20.1]#cp -f ./objs/nginx /apps/nginx/sbin/

#注意:需要加 -f 选项强制覆盖,否则会提示Text file busy

如果cp 不加-f 选项,会出现下面提示:

[root@nginx nginx-1.20.1]#cp objs/nginx /apps/nginx/sbin/

cp: overwrite '/apps/nginx/sbin/nginx'? y

cp: cannot create regular file '/apps/nginx/sbin/nginx': Text file busy

8.检查新版程序文件有没有问题

[root@nginx nginx-1.20.1]#/apps/nginx/sbin/nginx -t

9.向旧版nginx的master进程发送USR2信号

此处有两种写法:

[root@nginx nginx-1.20.1]#kill -USR2 `cat /apps/nginx/logs/nginx.pid`

[root@nginx nginx-1.20.1]#kill -USR2 '旧版nginx的master进程编号'

#发送信号USR2,平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx 

#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80

#此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进 程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理

#如上图,可以看到,新版nginx的master进程编号为15314,旧版为12271

10.查看进程信息

#可以看到两个master进程,新的master是旧版master的子进程,并生成新版的worker进程

#此时新版和旧版处于共存状态

11.向旧版nginx的master进程发送WINCH信号

#此处两种写法:

[root@nginx nginx-1.20.1]#kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`

[root@nginx nginx-1.20.1]#kill -WINCH '旧版nginx的master进程编号`

12.查看进程信息

#先关闭旧版nginx的worker进程,而不关闭nginx主进程方便回滚

#向原Nginx主进程发送WINCH信号,它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新 版Nginx处理 

#如果旧版worker进程有用户的请求,会一直等待处理完后才会关闭

#此时旧版和新版还是处于共存状态

13.向旧版nginx的master进程发送quit信号

此处两种写法:

[root@nginx nginx-1.20.1]#kill -QUIT `cat /apps/nginx/logs/nginx.pid.oldbin`

[root@nginx nginx-1.20.1]#kill -QUIT '旧版nginx的master进程编号'

14.查看进程信息

#经过一段时间测试,新版nginx服务没问题,最后发送QUIT信号,退出旧版的master

#此时旧版已下线,新版正式上线

15.查看当前版本信息

[root@nginx logs]# nginx -v
nginx version: nginx/1.20.1

二.回滚 1.向旧版nginx的master进程发送HUP信号

此处两种写法:

[root@nginx nginx-1.20.1]#kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`

[root@nginx nginx-1.20.1]#kill -HUP '旧版nginx的master进程编号'

2.查看进程信息

[root@nginx logs]# ps -aux | grep nginx
root       12271  0.0  0.0  46208  1352 ?        Ss   19:26   0:00 nginx: master process/apps/nginx/sbin/nginx
root       15314  0.0  0.1  46220  3368 ?        S    19:32   0:00 nginx: master process /apps/nginx/sbin/nginx
nginx     15315  0.0  0.0  46672  1916 ?        S    19:32   0:00 nginx: worker process
nginx      8607  0.0  0.0  46652  1908 ?        S    19:56   0:00 nginx: worker process
root       8611  0.0  0.0 112824   980 pts/3    S+   19:57   0:00 grep --color=auto nginx
[root@nginx logs]# pstree -p | grep nginx
 |-nginx(12271)-+-nginx(15314)---nginx(15315)
 |             `-nginx(8607)

#如果升级的版本发现问题需要回滚,可以发送HUP信号,重新拉起旧版本的worker

3.向新版nginx发送QUIT信号

[root@nginx logs]#kill -QUIT `cat /apps/nginx/logs/nginx.pid`

#关闭新版nginx的master进程

4.将备份的旧版nginx程序文件覆盖新版nginx文件

[root@nginx logs]# cp -f /opt/nginx.old /apps/nginx/sbin/nginx
cp:是否覆盖"/apps/nginx/sbin/nginx"? y

5.查看当前版本信息

[root@nginx logs]# nginx -v
nginx version: nginx/1.18.0

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前题目:nginx平滑升级和回滚-创新互联
转载来于:http://scyanting.com/article/csjdgj.html