环境说明
操作系统: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平滑升级和回滚-李佳程的个人主页](http://39.101.72.1/wp-content/uploads/2022/10/image-10.png)
#先关闭旧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平滑升级和回滚-李佳程的个人主页](http://39.101.72.1/wp-content/uploads/2022/10/image-11.png)
查看版本是不是已经是新版了
[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平滑升级和回滚-李佳程的个人主页](http://39.101.72.1/wp-content/uploads/2022/10/image-12.png)
失败后回滚
#如果升级的版本发现问题需要回滚,可以发送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平滑升级和回滚-李佳程的个人主页](http://39.101.72.1/wp-content/uploads/2022/10/image-13.png)
#最后查看版本,验证业务
[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平滑升级和回滚-李佳程的个人主页](http://39.101.72.1/wp-content/uploads/2022/10/image-14.png)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END