☰
Nginx 版本升级:普通升级(冷)与平滑升级(热)---企业场景实战
2026/10/24 5:30:25 网站建设 项目流程

企业需求:

公司要求将 Nginx 升级到指定版本(1.20.2升级到1.22.0),分别采用冷升级(停止服务后升级)和热升级(平滑升级,不中断现有连接)两种方式实施,并验证升级结果及网站访问是否正常。

升级原因:由于旧版本1.20有漏洞,漏洞如下:

CVE-2022-41741 MP4 模块内存损坏 可能导致工作进程崩溃

CVE-2022-41742 MP4 模块内存信息泄露 可能泄露部分内存数据

CVE-2021-23017 DNS 解析器内存覆盖 可能造成内存损坏

现在升级到1.22.0 问题解决

一、前期准备(冷 / 热升级共用)

1. 备份

①查看旧nginx编译参数

/usr/local/nginx/sbin/nginx -V

②备份旧二进制程序

cp /usr/local/nginx/sbin/nginx

③备份nginx全部配置目录

/usr/local/nginx/sbin/nginx.1.20.2.bak

2. 准备新版本

①新版本

②解包

③编译

cd nginx-1.22.0

./configure \ --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module --add-module=/opt/nginx-module-vts-master --with-http_ssl_module

3. 编译(只 make,不要 make install!!)

方案一:冷升级(停机升级,简单,业务中断)

1. 停止当前 Nginx 服务

/usr/local/nginx/sbin/nginx -s stop

2. 用编译好的新版本二进制覆盖旧程序

cp objs/nginx /usr/local/nginx/sbin/nginx

3. 校验配置语法

/usr/local/nginx/sbin/nginx -t

4. 启动 Nginx

/usr/local/nginx/sbin/nginx

5. 验证

①查看版本,确认升级成功

/usr/local/nginx/sbin/nginx -v

②浏览器访问网站,确认页面正常

netstat 查看80/443端口监听正常

6.冷升级回滚

nginx -s stop

cp /usr/local/nginx/sbin/nginx.1.20.2.bak /usr/local/nginx/sbin/nginx

/usr/local/nginx/sbin/nginx -v

方案二:热平滑升级(不中断现有连接,生产推荐)

1. 确认当前 nginx 运行,拿到 master 主进程 PID

ps aux | grep nginx # 找到 nginx: master process 的PID是 37467

2. 覆盖 nginx 二进制程序(替换成 1.22.0)

cp /opt/nginx-1.22.0/objs/nginx /usr/local/nginx/sbin/nginx

3. 向 nginx master 进程发送 USR2 信号:启动新版本 worker 进程

kill -USR2 37467

4. 向旧 master 发送 WINCH 信号:优雅关闭旧的 worker 进程

kill -WINCH 37467

5. (可选,保留旧 master 用于回滚)

等业务观察一段时间稳定后,如果确认没问题,可以发送`QUIT`关闭旧 master 进程:

kill -QUIT 37467

6.验证

①查看nginx版本

/usr/local/nginx/sbin/nginx -v

②查看监听端口

netstat -tlnp | grep nginx

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询