master进程是nginx平滑升级的调度中枢,通过usr2启动新master并继承监听套接字,winch令旧worker优雅退出,quit终止旧master,全程依托信号驱动与套接字继承机制实现无中断切换。

Master Process 是 Nginx 平滑升级的调度中枢,它不处理请求,但全程掌控新旧版本的切换节奏。整个过程不是“一刀切”替换,而是靠信号驱动、父子进程协作完成的渐进式交接。
Master 进程如何启动新版本实例
当收到 USR2 信号时,当前运行的 Master 进程会做三件事:
- 以自身为模板,fork 出一个全新的 Master 进程(使用新二进制文件);
- 将监听套接字(如 80/443 端口)通过 Unix 域通信传递给新 Master,确保它能立即接收新连接;
- 新 Master 启动后,自动派生属于自己的 Worker 进程,此时系统中同时存在两组进程:旧 Master + 旧 Worker、新 Master + 新 Worker。
Master 如何协调新旧 Worker 的共存与退出
旧 Master 不会立刻消失,它继续管理旧 Worker,直到它们完成手头任务:
- 收到 WINCH 信号后,旧 Master 指令所有旧 Worker 进入“优雅关闭”状态:不再 accept 新连接,但继续处理已建立的长连接(如大文件下载、WebSocket、Keep-Alive 请求);
- 旧 Worker 在处理完当前请求并关闭所有连接后,自行退出;
- 一旦所有旧 Worker 退出,旧 Master 就只剩空壳,此时发送 QUIT 信号,它才彻底终止。
Master 如何保证监听端口不中断
关键在于套接字继承机制:
- 旧 Master 在启动新 Master 时,并未释放监听 fd,而是将其复制并传递过去;
- 新 Master 拿到 fd 后,立即让新 Worker 开始 accept;
- 操作系统内核层面,只要至少一个进程持有该监听 socket,端口就持续可用,客户端完全感知不到后端进程更替。
Master 进程在回滚中的角色
回滚本质是“反向平滑升级”,Master 依然主导流程:
- 替换回旧二进制后,向当前正在运行的新 Master 发送 USR2,它会启动一个“旧版 Master”;
- 再向新 Master 发送 WINCH 和 QUIT,让它逐步交出控制权;
- 最终由旧版 Master 接管全部监听资源和 PID 文件,服务状态回归原点。
整个切换过程对客户端透明,依赖的是 Master 对进程生命周期和内核资源的精细管控,而不是简单重启或覆盖。











