平滑升级和回滚Nginx

编译安装Nginx

下载最新稳定版
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar xvf nginx-1.24.0.tar.gz -C /usr/local/src #进行解压
cd /nginx-1.24.0		#进入目录
查看当前版本
/apps/nginx/sbin/nginx -v
结果:
nginx version: nginx/1.22.1
----------------------------------------------------
/apps/nginx/sbin/nginx -V
结果:
nginx version: nginx/1.22.1
built by gcc 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04.1) 
built with OpenSSL 3.0.2 15 Mar 2022
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

开始编译新版本
./configure  (此内容是复制上-V的内容)--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

此时编译的中间文件存放在objs目录下

路径为/usr/local/src/nginx-xx.xx.xx/objs/

查看当前下载文件版本
./objs/nginx -v  或  ./objs/nginx -V

将旧文件备份(为后续回滚做准备)

cp /apps/nginx/sbin/nginx /opt/nginx.old

将此时的最新文件的nginx复制过去覆盖掉老版本程序文件,注意:需要加-f选项强行覆盖,否则会提示Test file busy

cp -f ./objs/nginx /apps/nginx/sbin/

检测此时的新版本配置文件语法以及兼容性

/app/nginx/sbin/nginx -t

发送信号USR2 平滑升级可执行程序,将存储有旧文件主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx
此时的两个master的进程同时在运行,只不过旧的master进程不在监听80,转换为新的master监听80
此时Nginx开启一个新的master进程,这个master进程会生成worker进程,这就是升级后的nginx进程,此时老进程不会自动退出,但有新的请求到来时会交给新的进程处理

kill -USR2 `cat /apps/nginx/logs/nginx.pid`

此时的状态是新老进程并存,但老进程并没有退出
接下来,先关闭旧nginx的worker进程,不关闭旧的nginx主进程方便回滚
此时向旧的nginx的master进程发送WINCH信号,它就会逐步关闭其下的worker进程(master进程并没有退出),这时所有新请求都会由新版nginx处理

kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`

但需要注意的是,此命令为优雅的推出,如果在升级之前有进程访问,也就是旧版本worker进程有用户连接,此时旧版本worker进程并不会关闭,会一直等待处理完,之后才会关闭
-------------------------此时的状态是能够回滚的最后状态-----------------------------
经过一段时间,如果测试没有问题,最后发送QUIT信号,退出老的master

kill -QUIT `cat /apps/nginx/logs/nginx.pid.oldbin`

此时查看版本

nginx -v

--------------------------------回到最后状态进行回滚----------------------------------
升级有问题进行回滚,发送HUP信号,重新拉起旧版本worker

kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`

关闭新版master和worker,如果不执行上面的HUP信号,此步QUIT信号也可以重新拉起旧版本的worker进程

kill -QUIT `cat /apps/nginx/logs/nginx.pid`

最后恢复旧版的文件

mv /opt/nginx.old  /apps/nginx/sbin
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值