Nginx热升级通过USR2、WINCH、QUIT信号实现零停机版本替换:先启动新Master,再优雅关闭旧Worker,最后终止旧Master;需确保二进制共存、配置兼容、权限一致。

Nginx 的热升级(Hot Upgrade)允许在不中断服务的前提下替换主程序二进制文件,核心在于 Master 进程平滑过渡到新版本,同时 Worker 进程逐步更替。整个过程不涉及手动 kill 或重启,关键点是**新旧二进制文件共存 + 信号驱动的进程交接**。
热升级前的准备工作
必须确保新旧二进制文件路径明确、权限一致,并且配置兼容:
- 将编译好的新 nginx 二进制文件(如 /opt/nginx-new/sbin/nginx)拷贝到目标位置,建议保留旧文件(如 /usr/sbin/nginx)不覆盖
- 用新二进制执行 -t 检查配置语法:
/opt/nginx-new/sbin/nginx -t,确认无误再继续 - 确保新二进制能访问原配置路径、日志目录、pid 文件等资源,用户/组权限与旧进程一致(通常为 nginx 或 www-data)
发送 USR2 信号触发新 Master 启动
这是热升级的起点:让当前 Master 进程 fork 出一个新 Master 进程,运行新二进制:
- 查出当前 Master 进程 PID:
cat /var/run/nginx.pid(或你配置的 pid 路径) - 发送 USR2 信号:
kill -USR2 $(cat /var/run/nginx.pid) - 此时系统中会存在两个 Master 进程(旧 + 新),以及两组 Worker 进程(旧 Master 管理的旧 Worker,新 Master 尚未启动 Worker)
优雅停止旧 Worker,完成切换
旧 Master 仍在处理请求,需主动通知它逐步退出,同时确保新 Worker 已就绪:
- 向旧 Master PID 发送 WINCH 信号:
kill -WINCH $(cat /var/run/nginx.pid),这会让旧 Master 关闭其管理的所有 Worker 进程(不再接受新连接,但处理完已有请求) - 等待旧 Worker 全部退出(可通过
ps aux | grep nginx观察),此时只剩新 Master 和它启动的 Worker - 最后向旧 Master PID 发送 QUIT 信号:
kill -QUIT $(cat /var/run/nginx.pid),终止旧 Master 进程
验证与清理
升级完成后需确认运行的是新版,并更新符号链接(可选):
- 检查进程所用二进制:
ls -l /proc/$(pgrep -f "nginx: master process")/exe,输出应指向新路径 - 查看版本:
nginx -v(注意:若 PATH 中仍是旧命令,需显式调用新路径,如 /opt/nginx-new/sbin/nginx -v) - 如需统一入口,可将旧二进制备份后,创建软链:
ln -sf /opt/nginx-new/sbin/nginx /usr/sbin/nginx
整个过程依赖 Nginx 自身对信号的实现逻辑,无需外部工具干预。只要新旧版本 ABI 兼容、配置无破坏性变更,就能实现真正的零停机升级。










