Nginx多进程架构保障服务不中断,核心在于主从分工、故障隔离、快速恢复和信号驱动:主进程极简只管配置、端口、生命周期与信号;工作进程相互独立崩溃不扩散;无锁设计规避竞争;热重载实现零中断升级。

主进程轻量专职,杜绝自身成为故障源
主进程只做四件事:读取配置、绑定端口、管理工作进程生命周期、响应系统信号(如 HUP、USR2、QUIT)。它不处理任何网络请求、不解析 HTTP、不读磁盘文件、不运行 Lua 脚本。这种极简路径让它几乎不会崩溃;即使异常退出,重启开销极小,且正在运行的工作进程完全不受影响。
工作进程彼此独立,崩溃不扩散
每个工作进程拥有独立的内存空间、文件描述符、连接池、定时器和缓存索引,进程间不共享可写状态(仅少量只读配置例外)。
- 某个进程因正则回溯、后端超时或内存分配失败而崩溃,操作系统只会终止该进程,其余进程照常服务
- 主进程通过 waitpid 在毫秒级内捕获 SIGCHLD,立即 fork 新进程补位,用户通常感知不到中断
- 启用 worker_rlimit_core 并设置 working_directory,可保留 core dump 用于事后分析根因
无锁设计降低内部风险
因进程间不共享可写状态,Nginx 避免了多线程常见的竞争条件、死锁和内存越界问题。
- 限流(limit_req)、缓存淘汰、连接超时等逻辑都在单个进程内闭环完成,无需加锁协调
- 例如 limit_req_zone 使用基于时间戳哈希的滑动窗口,各进程维护本地桶,仅通过共享内存广播失效通知,读取仍走本地索引
- 高频计数类操作优先使用 ngx_atomic_t 原子变量,避免锁带来的调度延迟和争用挂起
热重载与优雅退出保障变更零中断
执行 nginx -s reload 时,主进程先校验新配置语法,成功后再 fork 新工作进程,并向旧进程发送 QUIT 信号。
- 旧进程不再 accept 新连接,但继续处理已有请求直至完成,实现真正的零中断升级
- 若新配置有语法错误,主进程直接拒绝加载,旧进程持续运行——这是架构层面的容错兜底,不是运维补救手段
- 配合 worker_shutdown_timeout 可防止长连接阻塞升级流程,确保升级可控


















