nginx平滑升级本质是新旧进程共存与渐进退出,主进程统一调度、信号驱动、worker自主管理生命周期;新worker处理新连接,旧worker完成已有请求后退出;配置与二进制更新均依赖原子操作,保障安全无中断。

Nginx 多进程模型实现平滑服务升级,本质不是“切换”,而是“新旧共存+渐进退出”。整个过程不中断连接、不丢请求,用户完全无感,关键靠主进程统一调度、信号精准驱动、进程生命周期自主管理。
主进程统一接管升级动作
所有升级决策和执行均由 Master 进程集中完成,Worker 进程全程不参与配置解析或二进制加载。收到 USR2 信号 后,Master 才启动新版本的主进程;收到 HUP 信号 则只重载配置,不启新二进制。Worker 始终运行 fork 时继承的内存配置副本,只读不可变,彻底规避多进程并发读写配置导致的竞争与不一致。
新旧进程并行,连接分级承接
- 新 Master 启动后,立即 fork 出新 Worker,它们开始 accept 新建连接,并按新配置(或新二进制逻辑)处理请求
- 旧 Worker 不再 accept 新连接,但继续处理已建立的连接:包括 HTTP 长连接、正在上传的大文件、WebSocket 持久通道、Keep-Alive 空闲连接等
- 旧 Worker 在完成当前请求、超时关闭空闲连接后,自动退出——无需 kill -9,也不强制中断
原子化更新保障操作安全
无论是配置还是程序升级,都依赖系统级原子操作:
- 配置更新推荐先写临时文件(如
nginx.conf.new),再用mv命令替换——底层是rename()系统调用,瞬间完成,永不出现“读到半截配置”的风险 - 二进制升级时,先覆盖
/usr/sbin/nginx文件,再发 USR2;新 Master 启动时加载的是磁盘最新镜像,而旧进程仍在原内存镜像中运行,互不干扰
流量与健康状态协同演进
升级不仅是进程替换,更是服务能力的平稳过渡:
- 新增 upstream server 后 reload,新 Worker 自动使用含新节点的负载列表
- 配合
max_fails/fail_timeout和 readiness 探针,确保新后端真正就绪才分发流量 - 启用
proxy_next_upstream等重试机制,容忍新节点上线初期的短暂不可用











