Nginx平滑升级需严格复用旧版编译参数,通过USR2、WINCH、QUIT三步信号控制新旧进程交替,全程不中断服务,每步须验证进程状态并做好备份回滚准备。

Nginx 的 Master Process 本身不处理请求,只负责监听端口、派生 Worker、响应信号和管理生命周期。平滑升级二进制文件,本质是让新版本 Master 接管监听套接字(socket),同时旧 Worker 继续服务未完成连接——整个过程靠信号驱动,不中断服务。
必须先确认旧版编译参数一致
新二进制若模块缺失或路径错位,启动即失败。执行 nginx -V 查看 --configure arguments,编译新版时严格复用,尤其注意:
-
--prefix(安装路径) -
--with-http_ssl_module等关键模块开关 - OpenSSL、PCRE、zlib 等依赖路径
替换二进制前做好三重备份
- 备份旧二进制:
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old - 备份配置文件:
cp -r /usr/local/nginx/conf /usr/local/nginx/conf.bak.$(date +%Y%m%d) - 记录旧版信息:
nginx -V > /root/nginx-old-info.txt
按顺序发送三个信号,不可跳步或发错 PID
-
USR2 → 旧 Master PID:
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)
→ 旧 Master 启动新 Master(使用新二进制),生成nginx.pid.oldbin;新旧两套进程并存,端口持续监听 -
WINCH → 旧 Master PID(即
nginx.pid.oldbin中的 PID):kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
→ 旧 Worker 停止 accept 新连接,但继续处理长连接、上传、keep-alive 等存量请求 -
QUIT → 旧 Master PID(同上):
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
→ 等所有旧 Worker 退出后,旧 Master 自行终止;只剩新 Master + 新 Worker,升级完成
每一步都要验证
- 发 USR2 后:
ps aux | grep nginx应看到两组 master + worker - 发 WINCH 后:旧 Worker 数量应逐步归零,新 Worker 正常运行
- 升级完成后:检查
/usr/local/nginx/logs/nginx.pid是否指向新进程,执行nginx -V确认版本和模块已更新
回滚要和升级一样快
若新版本异常(如 502 频发、CPU 异常飙高):
- 恢复旧二进制:
cp /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx - 向新 Master 发 QUIT:
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid) - 旧 Master 仍在
nginx.pid.oldbin中,会自动恢复接管
不复杂但容易忽略


















