nginx平滑服务过渡依靠主从进程职责分离与信号协作实现:master统一处理sighup/usr2信号并原子更新配置或二进制,worker仅运行继承的只读配置;新旧进程并行,新worker接受新连接,旧worker处理完存量连接后退出。

Nginx 多进程架构实现平滑服务过渡,核心在于主进程(Master)与工作进程(Worker)的职责分离和信号协作,不靠锁排队,而靠进程生命周期管理来达成“旧的不中断、新的无缝接”。整个过程对用户完全无感。
主进程统一调度,避免配置竞争
所有 reload 或升级动作均由 Master 进程集中控制:收到 SIGHUP(重载配置)或 USR2(二进制升级)信号后,它才开始解析新配置或加载新二进制。Worker 进程不参与决策,也不读取磁盘配置文件——它们只使用 fork 时继承下来的内存副本,运行期间配置只读。这就从源头消除了多进程同时读写配置导致的不一致风险。
新旧进程并行运行,连接分级退出
平滑的关键不是“切换”,而是“共存”:
- 新 Worker 启动后立即 accept 新建连接,按新配置处理请求
- 旧 Worker 继续处理已建立的连接(包括长连接、上传中请求、WebSocket 等),不接受新连接
- 旧 Worker 在完成当前请求、关闭空闲连接后自动退出,无需强制 kill
配置与二进制更新均依赖原子操作
无论是改配置还是换程序,Nginx 都用系统级原子性保障安全:
- 配置更新推荐先写临时文件(如
nginx.conf.new),再用mv原子替换——本质是rename()系统调用,不会出现读到半截内容 - 二进制升级时,先替换
/usr/sbin/nginx文件,再发 USR2 信号;新 Master 启动时加载的是磁盘上最新二进制,旧进程仍运行在原镜像上
健康状态与流量协同,扩容也平滑
后端扩容这类动态变更,同样依托进程模型与配置联动:
- 新增 upstream server 后 reload,新 Worker 自动使用含新节点的 upstream 列表
- 配合
max_fails/fail_timeout和 readiness 探针,确保新节点真正就绪才承接流量 - 启用
proxy_next_upstream等重试机制,容忍节点刚上线时的短暂不可用











