Nginx二进制平滑升级通过Master进程管理机制实现,利用USR2启动新master、WINCH和QUIT逐步关闭旧进程,全程不中断服务。

通过 Master 进程管理机制实现 Nginx 二进制平滑升级,核心是利用其 master-worker 架构与信号协同完成新旧进程的并存、交接与清理,全程不中断服务。关键不在替换文件本身,而在让新旧 master 和 worker 有序共存、分阶段切换。
确保新旧二进制共存且环境兼容
升级前必须满足三个基础前提:
- 将新编译的 nginx 二进制(如 /root/nginx-1.29.4/objs/nginx)拷贝到生产路径(如 /usr/local/nginx/sbin/nginx),但**不覆盖旧文件前先备份**:
cp -p /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak - 用新二进制执行
-t检查配置有效性:/root/nginx-1.29.4/objs/nginx -t,确保路径、用户权限、模块加载与旧版一致 - 确认新二进制能访问原 pid 文件(如 /usr/local/nginx/logs/nginx.pid)、日志目录、SSL 证书等资源,运行用户(如 nginx)和文件权限需完全一致
发送 USR2 启动新 Master 并继承监听套接字
这是热升级的启动信号,触发旧 master fork 出一个新 master 进程,使用新二进制启动:
- 获取当前 master PID:
OLD_PID=$(cat /usr/local/nginx/logs/nginx.pid) - 发送信号:
kill -USR2 $OLD_PID - 此时系统中会出现两组进程:旧 master + 旧 worker,以及新 master(PID 写入 nginx.pid.oldbin)+ 新 worker 尚未启动(需等待后续操作)
- 验证:
ps aux | grep nginx应看到两个 master 进程;ls -l /proc/$(pgrep -f "nginx: master process" | head -1)/exe可分别查看各自指向的二进制路径
用 WINCH 和 QUIT 逐步关闭旧进程链
新 master 启动后,需主动引导旧 master 退出,同时确保流量无损过渡:
- 向旧 master 发送
WINCH:kill -WINCH $OLD_PID,它会优雅关闭所有自己管理的 worker(不再接受新连接,但处理完已有请求) - 等待旧 worker 全部退出(可通过
ps aux | grep "worker process"观察),此时仅剩新 master 及其已启动的 worker - 向旧 master 的 PID(或读取 nginx.pid.oldbin)发送
QUIT:kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin),旧 master 在确认 worker 全退后自行终止
验证与收尾操作
升级完成后必须确认实际运行版本,并清理冗余状态:
- 检查当前主进程所用二进制:
ls -l /proc/$(pgrep -f "nginx: master process")/exe,输出应明确指向新路径 - 查看版本:
/usr/local/nginx/sbin/nginx -v(注意不是 PATH 中的 nginx,避免误调旧命令) - 若需统一入口,可更新软链接:
ln -sf /usr/local/nginx/sbin/nginx /usr/bin/nginx(按实际 PATH 调整) - 清理临时文件:
rm -f /usr/local/nginx/logs/nginx.pid.oldbin











