nginx平滑重载不中断连接的关键在于master不重启、旧worker继续处理已有请求、新worker接管新连接。重载前自动语法校验,失败则中止;校验通过后master fork新worker并发送quit信号,旧worker优雅退出,全程透明无感知。

Nginx 平滑重载能实现不中断连接,关键在于它不重启主进程,也不强制终止正在处理的请求,而是靠 master-worker 架构 + 信号机制 + 进程自然过渡 来完成。整个过程对用户完全透明,已建立的连接(包括 HTTPS keep-alive、WebSocket、HTTP/2 流)继续由旧 worker 处理,新连接则由新 worker 接管。
配置重载前必须做语法校验
执行 nginx -s reload 时,master 进程会自动调用 nginx -t 逻辑校验配置。如果语法错误或监听端口被占用,重载直接中止,旧配置继续运行——这是防止误操作导致服务中断的第一道防线。
- 建议手动先跑一次:
nginx -t -c /etc/nginx/nginx.conf - 确认输出包含 syntax is ok 和 test is successful
- 特别注意 include 的子配置文件路径是否正确、权限是否可读
重载触发后 master 如何协调新旧 worker
校验通过后,master 进程立即基于新配置 fork 出一批新 worker 进程;同时向旧 worker 发送 QUIT 信号,但不会立刻杀掉它们。
- 新 worker 启动后,开始 accept 新连接,按新规则处理(如新 upstream、新 rewrite 规则)
- 旧 worker 进入“优雅退出”状态:不再 accept 新连接,但继续处理已建立连接上的所有请求(包括长连接中的后续请求)
- 旧 worker 在完成全部当前请求或超时(默认
worker_shutdown_timeout,未设则等连接自然断开)后自行退出
真正零中断的关键细节
不中断 ≠ 所有行为都即时生效。有些配置项在重载后需满足特定条件才起效,容易被忽略:
- SSL 证书更新:新 worker 启动时加载新证书,但旧 worker 仍使用旧证书服务已有 TLS 连接(符合 RFC,客户端无感知)
- upstream 变更:新连接走新 upstream 列表;旧连接若复用后端 keepalive 连接,仍可能打到旧节点(只要该后端还存活)
- listen 指令变更:新增端口需确保未被占用;删除端口后,旧 worker 不再 listen,但已建立连接不受影响
验证重载是否成功
不要只看命令返回,要确认实际行为符合预期:
- 查进程:
ps aux | grep nginx应看到新旧 worker 并存一段时间 - 看日志:
tail -f /var/log/nginx/error.log确认无 “failed to start” 或 “bind() failed” 类报错 - 测行为:用 curl 或浏览器访问,验证新 location、新 header、新代理目标是否生效
- 观察旧 worker 消失:
lsof -i :80随时间推移,旧 worker 的 socket 数量应逐步归零











