Nginx 平滑升级的实战指南!(含备份+业务0中断+回滚)

今天分享一下Nginx如何平滑升级,做到零中断。

在实际生产环境,安全部门一般都会定期去扫描程序漏洞,基本都需要升级版本。

部分运维人员的做法是:停服务--> 删除旧版本nginx-->安装新版本nginx-->启动服务。

这种方式需要停服务,非常影响用户体验感,所以我下面介绍一下如何进行不停机且安全可控得进行平滑升级Nginx。

1. 实验环境说明操作系统:Rockylinux9.4当前nginx是编译安装部署路径:/data/nginx从nginx1.26.2升级到1.29.02. 升级前先备份!非常关键!

线上升级,没备份 = 自杀式升级。

全量备份:

复制
tar -zcvf /data/nginx-backup-$(date +%F).tar.gz /data/nginx/1.

回滚时你只需 tar -zxvf + reload,1 分钟恢复原状。

3. 确认原版本和编译参数
复制
[root@webserver data]# nginx -V nginx version: nginx/1.26.2 built by gcc 11.5.0 20240719 (Red Hat 11.5.0-5) (GCC) built with OpenSSL 3.2.2 4 Jun 2024 TLS SNI support enabled configure arguments: --prefix=/data/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre --with-stream --with-stream_ssl_module1.2.3.4.5.6.

非常重要!新版本必须用相同参数编译才能平滑替换,不过可以新增参数!

4. 安装依赖
复制
dnf install -y gcc make zlib-devel pcre-devel openssl-devel wget1.

这一步可以省略,一般编译旧版本时已经安装了依赖。

5. 下载并编译 Nginx 新版本

(1) 下载源码

版本可以具体根据漏扫要求,一般是建议最新版本,我这边选1.29.0版本:

复制
wget https://nginx.org/download/nginx-1.29.0.tar.gz tar -zxvf nginx-1.29.0.tar.gz cd nginx-1.29.01.2.3.

(2) 使用原配置参数重新编译

这里也可以添加一些新的参数,但是尽量不要删除以前的参数,建议在已有基础添加新参数。

复制
./configure --prefix=/data/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-pcre \ --with-stream \ --with-stream_ssl_module make1.2.3.4.5.6.7.8.

注意注意:千万不要 make install,避免直接覆盖现有 Nginx!

6. 平滑升级核心流程

(1) 替换 Nginx 可执行文件

复制
# 移动旧版本可执行文件 mv /data/nginx/sbin/nginx /data/nginx/nginx/sbin/nginx.old # 将新版本的执行文件放置在安装目录下 cp ./objs/nginx /data/nginx/sbin/nginx # 检测Nginx进程,可见旧的版本进程还在运行 ps -ef |grep nginx1.2.3.4.5.6.7.8.

(2)启动新主进程(平滑切换)

复制
# 杀掉旧版nginx主进程,让新进程重新生成 kill -USR2 `cat /data/nginx/logs/nginx.pid` # 上面引用部分主要是找出nginx的PID,你也可以根据ps来找。1.2.3.4.

此时存在4个进程.  2个旧版nginx进程  2个新版nginx进程。

新的 master 进程加载新版本。

老版本PID文件变为 .pid.oldbin,仍然工作中:

(3) 优雅关闭旧 worker进程

复制
kill -WINCH `cat /data/nginx/logs/nginx.pid.oldbin`1.

旧worker 会逐步停止服务,连接自动转移到新版本,旧master进程还在。

7. 验证是否升级成功

查看版本:

复制
nginx -v1.

检查日志无报错:

复制
tail /data/nginx/logs/error.log1.

确认监听端口仍在线:

复制
netstat -lntup |grep nginx1.

多核 CPU 下也可观察进程切换:

复制
ps -ef | grep nginx1.

8. 结束旧主进程

等业务确认OK后,没问题,就可以杀掉旧的master进程了。

复制
kill -QUIT `cat /data/nginx/logs/nginx.pid.oldbin` # 再次检查 ps -ef |grep nginx1.2.3.4.

此时旧版进程彻底退出,升级完成!

9. 快速回滚操作

如果升级后出问题,只需执行:

复制
cp /data/nginx/sbin/nginx.bak /data/nginx/sbin/nginx nginx -s reload1.2.

也可以恢复整个 Nginx 安装目录:根据之前那个备份目录直接解压后重载nginx:

复制
tar -zxvf /data/nginx-backup-YYYY-MM-DD.tar.gz -C / nginx -s reload1.2.

谨记:先备份后操作!如果可以测试环境先行!

阅读剩余
THE END