nginx平滑升级由master进程主导,通过usr2、winch、quit三步信号协调新旧进程并行与交接,实现零停机;需确保编译参数一致、路径配置正确,并预置快速回滚机制。

Master 进程的权限与角色
Master 以 root 身份启动,独占监听 socket(如 80/443),但它本身不解析 HTTP 请求。它的职责很明确:
- fork 出 Worker 进程来实际处理连接
- 监听并响应系统信号(USR2、WINCH、QUIT 等)
- 管理所有子进程的启停与状态
正因为 Master 持有监听 fd,新 Master 启动时能直接继承该 fd,无需重新 bind,端口始终在线——这是平滑的前提。
三步信号驱动的升级流程
每一步都必须发给正确的 PID,且严格按顺序执行,否则会中断服务:
-
kill -USR2 $(cat nginx.pid):通知当前 Master 启动新版本的 Master 和 Worker。此时生成
nginx.pid.oldbin,新旧两套进程共存,旧 Worker 继续服务存量连接,新 Worker 开始接收新请求 - kill -WINCH $(cat nginx.pid):让旧 Master 指令其下属 Worker 优雅退出——不再 accept 新连接,但继续处理已建立的长连接、上传中请求、keep-alive 等未完成事务
- kill -QUIT $(cat nginx.pid):等旧 Worker 全部退出后,旧 Master 自行终止,只留下新 Master + 新 Worker,升级完成
升级前必须满足的硬性条件
信号再准,也救不了不兼容的二进制:
- 新版本编译参数必须与旧版完全一致(用
nginx -V查configure arguments),尤其 OpenSSL、PCRE、模块开关(如--with-http_ssl_module) - 新二进制文件不能直接
make install覆盖,应先备份旧版(如cp nginx nginx.bak),再拷入新版本并测试:./nginx -t -c /path/to/nginx.conf - 确保 pid 文件路径、日志路径、配置路径与旧环境一致,避免新进程因路径错误无法启动
回滚不是备选,而是升级的一部分
生产环境出问题没有排查时间,回滚必须像升级一样快:
- 若新版本异常,立即向新 Master 发送
kill -QUIT(PID 来自nginx.pid),它退出后旧 Master 仍在运行,服务自动恢复 - 旧二进制、旧配置、旧日志路径必须保留未改动;建议提前写好一键回滚脚本,并在预发环境实操验证
- 升级过程中不要删除
nginx.pid.oldbin,它是回滚时定位旧 Master 的关键依据











