Nginx平滑升级和回滚

环境说明

操作系统:Centos 7.9
nginx旧版本:1.18.0
nginx新版本:1.22.1

升级过程

将旧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进程平滑停止
向旧master进程发送QUIT信号,关闭旧master,并删除Nginx.pid.oldbin文件
如果发现升级有问题,可以回滚∶向旧master发送HUP,向新master发送QUIT

上传或者下载最新的稳定版本

#下载稳定的nginx版本软件源码包
[root@nginx02 ~]# wget http://nginx.org/download/nginx-1.22.1.tar.gz

解压源码包

#解压到当前目录下
[root@nginx02 ~]# tar xf nginx-1.22.1.tar.gz

查看当前版本

#查看当前使用版本和编译选项
[root@nginx02 nginx-1.22.1]# /apps/nginx/sbin/nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --user=nginx --prefix=/apps/nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

#查看当前nginx进程
[root@nginx02 ~]# pstree -p | grep nginx
           |-nginx(1015)---nginx(1017)

编译新版本

#编译新版本nginx,编译选项和当前版本相同
[root@nginx02 ~]# cd nginx-1.22.1/
[root@nginx02 nginx-1.22.1]# ./configure --user=nginx --prefix=/apps/nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

[root@nginx02 nginx-1.22.1]# make

#查看新版本
[root@nginx02 nginx-1.22.1]# objs/nginx -v
nginx version: nginx/1.22.1

开始升级

#查看两个版本
[root@nginx02 nginx-1.22.1]# ll objs/nginx /apps/nginx/sbin/nginx
-rwxr-xr-x 1 nginx nginx 7774224 Oct 28 09:55 /apps/nginx/sbin/nginx
-rwxr-xr-x 1 root  root  7914992 Oct 28 11:20 objs/nginx

#备份当前版本nginx命令
[root@nginx02 nginx-1.22.1]# cp /apps/nginx/sbin/nginx /apps/nginx/sbin/nginx.old

#强制将新版本nginx命令覆盖当前版本命令文件
[root@nginx02 nginx-1.22.1]# cp -f ./objs/nginx /apps/nginx/sbin/
cp: overwrite ‘/apps/nginx/sbin/nginx’? y

#检测有无问题
[root@nginx02 nginx-1.22.1]# /apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful

#发送信号USR2,平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx;
#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80
#此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
[root@nginx02 nginx-1.22.1]# kill -USR2 `cat /apps/nginx/run/nginx.pid`
[root@nginx02 nginx-1.22.1]# ps auxf|grep nginx
[root@nginx02 nginx-1.22.1]# pstree -p | grep nginx
图片[1]-Nginx平滑升级和回滚-李佳程的个人主页
#先关闭旧nginx的worker进程,而不关闭nginx主进程方便回滚
#向原Nginx主进程发送WINCH信号,它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理
[root@nginx02 nginx-1.22.1]# kill -WINCH `cat /apps/nginx/run/nginx.pid.oldbin`
[root@nginx02 nginx-1.22.1]# ps auxf|grep nginx
[root@nginx02 nginx-1.22.1]# pstree -p | grep nginx
图片[2]-Nginx平滑升级和回滚-李佳程的个人主页
查看版本是不是已经是新版了
[root@nginx02 nginx-1.22.1]# nginx -V
nginx version: nginx/1.22.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --user=nginx --prefix=/apps/nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

[root@nginx02 nginx-1.22.1]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Fri, 28 Oct 2022 03:54:23 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Fri, 28 Oct 2022 01:55:03 GMT
Connection: keep-alive
ETag: "635b3677-264"
Accept-Ranges: bytes

#测试一段时间,新版本对业务无影响,最后发送QUIT信号,退出老的master,此时老的master主进程也退出了;
[root@nginx02 nginx-1.22.1]# kill -QUIT `cat /apps/nginx/run/nginx.pid.oldbin`
[root@nginx02 nginx-1.22.1]# ps auxf|grep nginx
[root@nginx02 nginx-1.22.1]# pstree -p | grep nginx
图片[3]-Nginx平滑升级和回滚-李佳程的个人主页

失败后回滚

#如果升级的版本发现问题需要回滚,可以发送HUP信号,重新拉起旧版本的worker
[root@nginx02 nginx-1.22.1]# kill -HUP `cat /apps/nginx/run/nginx.pid.oldbin`

#关闭新版的master进程
[root@nginx02 nginx-1.22.1]# kill -QUIT `cat /apps/nginx/run/nginx.pid`

#强制将旧版本nginx命令恢复
[root@nginx02 nginx-1.22.1]# cp -f /apps/nginx/sbin/nginx.old /apps/nginx/sbin/nginx
cp: overwrite ‘/apps/nginx/sbin/nginx’? y

#查看进程
[root@nginx02 nginx-1.22.1]# ps auxf|grep nginx
[root@nginx02 nginx-1.22.1]# pstree -p | grep nginx
图片[4]-Nginx平滑升级和回滚-李佳程的个人主页
#最后查看版本,验证业务
[root@nginx02 nginx-1.22.1]# nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --user=nginx --prefix=/apps/nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

[root@nginx02 nginx-1.22.1]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Fri, 28 Oct 2022 03:56:02 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Fri, 28 Oct 2022 01:55:03 GMT
Connection: keep-alive
ETag: "635b3677-264"
Accept-Ranges: bytes
图片[5]-Nginx平滑升级和回滚-李佳程的个人主页
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享