直接用新版本源码替换旧二进制是平滑修复nginx安全漏洞的唯一可靠方式;官方不提供补丁,需严格复用旧configure参数编译新版,通过usr2/winch/quit信号完成热切换,并验证功能与回滚准备。

直接用新版本源码替换旧二进制,是平滑修复 Nginx 安全漏洞的唯一可靠方式。官方不提供补丁,也不支持对旧版“打补丁”,所谓“启用带修复的组件”,本质就是编译并切换到已修复漏洞的版本。
确认漏洞影响与目标版本
先查当前版本及是否在漏洞影响范围内,例如:
- 运行 nginx -V 查看版本号和编译参数;
- 对照 CVE 公告(如 CVE-2026-27654 影响 WebDAV,需升至 1.28.3+ 或 1.29.7+;CVE-2026-42945 影响 0.6.27~1.30.0,需升至 1.30.1+);
- 优先选择最新稳定版(Stable),而非主线版(Mainline),生产环境更稳妥。
保持兼容性的编译准备
新版本必须继承旧版的模块和依赖,否则可能引发配置失效或功能异常:
- 用 nginx -V 输出中的 configure arguments 作为新编译的基础参数;
- 检查系统是否装齐依赖:gcc、pcre-devel、zlib-devel、openssl-devel;
- 若旧版启用了第三方模块(如 echo-nginx-module),需同步下载并加入
--add-module=参数。
执行平滑升级操作
不中断服务的关键在于信号控制,不是简单覆盖二进制:
- 编译完成后,只执行 make,不要 make install,手动拷贝新
objs/nginx到原 sbin 目录,并备份旧文件为nginx.old; - 发送 USR2 信号启动新 master 进程:
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid); - 发送 WINCH 信号优雅关闭旧 worker:
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid); - 确认新进程运行正常后,再发 QUIT 给旧 master 进程(PID 可从
ps aux | grep nginx查得)。
验证与回滚保障
升级不是终点,验证和兜底同样重要:
- 检查版本:
nginx -v;查看进程:ps aux | grep nginx,应只剩新 master 和其 worker; - 测试 HTTPS、HTTP/2、代理等功能是否正常,尤其注意 alias + COPY/MOVE 等高危组合是否已被禁用;
- 保留
nginx.old和完整配置备份,若异常可立即执行kill -QUIT [旧master PID]并重命名nginx.old → nginx回退。











