Nginx热部署核心是master-worker模型与信号驱动的平滑过渡:master校验配置后fork新worker处理新连接,旧worker继续完成已有请求,新旧进程并存实现零中断;升级二进制时通过USR2/WINCH/QUIT信号配合SO_REUSEPORT端口复用,保障长连接、上传、流响应等不中断。

Nginx 实现热部署且不丢失请求,核心在于其 master-worker 进程模型 和 信号驱动的平滑过渡机制,不是靠“重启服务”,而是靠“新旧进程并存 + 请求自然过渡”。
master 进程接管配置变更,不直接处理请求
启动后,master 进程只负责读取配置、管理 worker、监听信号,它本身不处理任何客户端连接。所有 HTTP 请求都由 worker 进程实际响应。这意味着:即使 master 重新加载配置或启动新 worker,已建立的 TCP 连接和正在处理的请求仍由原 worker 继续完成,用户无感知。
reload 操作本质是“双 worker 并行期”
执行 nginx -s reload 时,master 进程会:
- 先用 nginx -t 校验新配置语法是否正确;
- 若通过,则 fork 出一批全新 worker 进程,这些新 worker 按照新配置(如新 upstream、新 limit_rate、新 SSL 设置等)开始 accept 新连接;
- 旧 worker 进程不会被立即杀死,而是继续处理完手上已接收但尚未响应完毕的请求(包括长连接、慢请求、上传中文件等);
- 当旧 worker 处理完所有现存任务后,自动退出,整个过程无强制中断。
升级二进制文件也支持热部署(USR2 + WINCH + QUIT)
不只是配置更新,Nginx 还支持**不中断服务地升级自身程序版本**,靠的是操作系统级别的进程替换能力:
- 先编译安装新版 nginx 二进制,覆盖旧文件(或放在独立路径);
- 向当前 master 进程发送 SIGUSR2:master 启动一个新 master 进程,并由它拉起一套全新 worker(使用新版二进制);
- 此时系统中有两套 master-worker:老 master 带老 worker,新 master 带新 worker;新连接全部由新 worker 接收;
- 再向老 master 发送 SIGWINCH:优雅关闭所有老 worker(处理完手头请求后退出);
- 最后向老 master 发送 SIGQUIT:老 master 自身退出,仅保留新 master 及其 worker。
关键保障:端口复用与内核连接保持
新旧 worker 能同时监听同一端口(如 80/443),依赖 Linux 的 SO_REUSEPORT 特性(Nginx 1.9.1+ 默认启用)。内核负责将新入连接分发给新 worker,而已有连接的 socket 文件描述符仍归属原 worker,不受影响。因此:
- HTTP/1.1 持久连接不会断开;
- WebSocket 长连接持续工作;
- 正在上传的大文件、流式响应均不受干扰。


















