企业需求:
公司要求将 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