Nginx中Master进程控制Worker进程平滑重启流程

2次阅读

nginx收到hup信号或执行nginx -s reload时,master进程重新加载配置并启动新worker,旧worker优雅退出:停止接受新连接但处理完已有请求后退出;新旧worker共存期间端口复用保障服务不中断。

Nginx中Master进程控制Worker进程平滑重启流程

当 Nginx 接收到 HUP 信号时,Master 进程会启动平滑重启(reload)流程:它不中断现有连接,而是让旧 Worker 处理完正在服务的请求后退出,同时拉起新 Worker 加载更新后的配置并开始接流。

Master 进程如何触发 reload 流程

用户执行 nginx -s reload 或向 Master 进程发送 SIGHUP 信号后,Master 会:

  • 重新读取并校验配置文件(nginx.conf 及其 include 的文件);
  • 若配置语法错误,直接报错退出 reload,旧 Worker 继续运行;
  • 若校验通过,则 fork 出新的 Worker 进程,使用新配置初始化;
  • 不再向旧 Worker 派发新连接,但允许其继续处理已建立的连接和请求。

Worker 进程如何实现“优雅退出”

旧 Worker 收到 Master 发送的 QUIT 信号后,并不会立即终止,而是进入“优雅关闭”状态:

  • 停止接受新连接(关闭监听 socket 的 accept 队列);
  • 继续处理已接收但未完成的请求(包括长连接、上传中、响应未发完等情况);
  • 当所有活跃请求结束且空闲超时(默认 worker_shutdown_timeout 未设时无硬限制),进程自动退出;
  • 可通过配置 worker_shutdown_timeout 10s; 设置最大等待时间,超时后强制关闭剩余连接。

Master 如何管理新旧 Worker 的生命周期

在 reload 过程中,Master 始终保持对全部 Worker 的控制权:

  • 新 Worker 启动后,会尝试绑定端口;若端口已被旧 Worker 占用(如 keepalive 连接未断开),新 Worker 仍能正常启动并接管新连接(linux 支持 SO_REUSEPORT 或由旧 Worker 主动释放监听 socket);
  • 旧 Worker 退出后,Master 将其从内部进程列表中移除;
  • 若 reload 中出现异常(如新 Worker 启动失败),Master 会记录错误日志,但不会杀掉旧 Worker,保障服务持续可用。

验证 reload 是否成功的关键点

可结合以下方式确认 reload 已生效且无异常:

  • 检查 nginx.pid 文件内容是否变化(PID 不变,但内部 worker 数组已更新);
  • 执行 ps aux | grep nginx,观察是否有两批 Worker(旧进程状态为 exiting,新进程为 running);
  • 查看 Error.log,确认有类似 "reloading configuration""exit 日志;
  • curl -I http://localhost 或访问业务接口,确保响应正常且新配置(如新增 header、改写的 location)已生效。
text=ZqhQzanResources