Nginx平滑升级和回滚

Nginx平滑升级和回滚

1 平滑升级和回滚

对nginx版本进行升级满足其功能的需求:比如添加新模块,需要新功能,此时Nginx又跑着业务无法停掉,这时候就可能会选择平滑升级。

1.1平滑升级流程

分为四个阶段

只有旧版nginx的master和worker进程
旧版和新版nginx的master和worker进程并存,由旧版nginx接收处理用户的新请求
旧版和新版nginx的master和worker进程并存,由新版nginx接收处理用户的新请求
只有新版nginx的master和worker进程

主要过程

image-20220604195402185
将旧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

1.2平滑升级和回滚案例

#下载最新稳定版
[root@rocky8 ~]# wget http://nginx.org/download/nginx-1.22.0.tar.gz
[root@rocky8 ~]# tar vxf nginx-1.22.0.tar.gz
[root@rocky8 ~]# cd nginx-1.22.0/

#查看当前使用的版本及编译选项。结果如下:
[root@rocky8 nginx-1.22.0]# /apps/nginx/sbin/nginx -V
nginx version: nginx/1.20.2
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-3) (GCC) 
built with OpenSSL 1.1.1k  FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --with-http_ssl_module

#开始编译新版本
root@rocky8 nginx-1.22.0]# ./configure --prefix=/apps/nginx \
--user=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

#只要make无需要make install
[root@rocky8 nginx-1.22.0]# make
[root@rocky8 nginx-1.22.0]# objs/nginx -V
nginx version: nginx/1.22.0
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-3) (GCC) 
built with OpenSSL 1.1.1k  FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=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@rocky8 nginx-1.22.0]#

#查看两个版本
[root@rocky8 nginx-1.22.0]# ll objs/nginx /apps/nginx/sbin/nginx
-rwxr-xr-x 1 root root 5878040 Jun  4 10:43 /apps/nginx/sbin/nginx
-rwxr-xr-x 1 root root 7586992 Jun  4 20:11 objs/nginx

#把之前的旧版的nginx命令备份
cp /apps/nginx/sbin/nginx
[root@rocky8 nginx-1.22.0]# cp /apps/nginx/sbin/nginx /opt/nginx.old


#把新版本的nginx命令复制过去覆盖旧版本程序文件,注意:需要加 -f 选项强制覆盖,否则会提示Textfile busy
[root@rocky8 nginx-1.22.0]# cp -f ./objs/nginx /apps/nginx/sbin/
cp: overwrite '/apps/nginx/sbin/nginx'? y


#检测一下有没有问题
[root@rocky8 nginx-1.22.0]# /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@rocky8 nginx-1.22.0]# kill -USR2 `cat /apps/nginx/logs/nginx.pid`
#可以看到两个master,新的master是旧版master的子进程,并生成新版的worker进程
[root@rocky8 ~]# ps auxf|grep nginx
root       15315  0.0  0.1  12136  1176 pts/1    S+   20:22   0:00              \_ grep --color=auto nginx
root       11133  0.0  0.0  42252   772 ?        Ss   11:09   0:00 nginx: master process /apps/nginx/sbin/nginx
nobody     11135  0.0  0.5  77008  4904 ?        S    11:09   0:00  \_ nginx: worker process
[root@rocky8 ~]# ps auxf|grep nginx
root       15319  0.0  0.1  12136  1136 pts/1    S+   20:23   0:00              \_ grep --color=auto nginx
root       11133  0.0  0.2  42252  2664 ?        Ss   11:09   0:00 nginx: master process /apps/nginx/sbin/nginx
nobody     11135  0.0  0.5  77008  4904 ?        S    11:09   0:00  \_ nginx: worker process
root       15316  0.0  0.6  42568  5928 ?        S    20:23   0:00  \_ nginx: master process /apps/nginx/sbin/nginx
nginx      15317  0.0  0.5  74748  4968 ?        S    20:23   0:00      \_ nginx: worker process



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

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

#如果旧版worker进程有用户的请求,会一直等待处理完后才会关闭
[root@rocky8 ~]#  ps auxf|grep nginx
root       15344  0.0  0.1  12136  1044 pts/1    S+   20:34   0:00              \_ grep --color=auto nginx
root       11133  0.0  0.2  42252  2664 ?        Ss   11:09   0:00 nginx: master process /apps/nginx/sbin/nginx
nobody     11135  0.0  0.5  77008  4904 ?        S    11:09   0:00  \_ nginx: worker process is shutting down
root       15316  0.0  0.6  42568  5928 ?        S    20:23   0:00  \_ nginx: master process /apps/nginx/sbin/nginx
nginx      15317  0.0  0.5  74748  4968 ?        S    20:23   0:00      \_ nginx: worker process




[root@rocky8 ~]# pstree -p | grep nginx
           |-nginx(11133)-+-nginx(15316)---nginx(15317)
           |              `-nginx(11135)
[root@rocky8 ~]# 

#经过一段时间测试,新版本服务没问题,最后发送QUIT信号,退出老的master
[root@rocky8 ~]# kill -QUIT `cat /apps/nginx/logs/nginx.pid.oldbin`

[root@rocky8 nginx-1.22.0]# nginx -v
nginx version: nginx/1.22.0
[root@rocky8 ~]# curl -I http://10.0.0.68/
HTTP/1.1 200 OK
Server: nginx/1.22.0
Date: Sat, 04 Jun 2022 12:37:53 GMT
Content-Type: text/html
Content-Length: 39
Last-Modified: Sat, 04 Jun 2022 02:43:57 GMT
Connection: keep-alive
ETag: "629ac6ed-27"
Accept-Ranges: bytes

[root@rocky8 ~]# 



#回滚
#如果升级的版本发现问题需要回滚,可以发送HUP信号,重新拉起旧版本的worker
[root@rocky8]#kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`
[root@rocky8]#pstree -p |grep nginx
     |-nginx(8814)-+-nginx(12014)-+-nginx(12015)
     |       |        `-nginx(12016)
     |       |-nginx(12090)
     |       `-nginx(12091)
#最后关闭新版的master
[root@rocky8]#kill -QUIT `cat /apps/nginx/logs/nginx.pid`

#恢复旧版的文件
[root@rocky8]# mv /opt/nginx /apps/nginx/sbin/


1.3总结

一般来说,平滑升级适用于单机模式,对于生成环境都是大规模,有LVS的权重,由LVS来权重指定,可以直接卸载升级。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ehuo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值