Nginx采用主从多进程架构:1个Master进程负责配置加载、资源初始化、Worker管理与信号处理,多个Worker进程以非阻塞异步方式并发处理请求,通过信号实现优雅重启、日志重开与平滑升级。

Nginx 的多进程架构不是靠多个独立程序拼凑出来的,而是由一个可执行文件通过 fork() 派生出主从关系明确的进程组——一个 Master 进程统筹全局,多个 Worker 进程并行处理请求。这种设计让服务既稳定又高效,关键在于分工清晰、通信轻量、故障隔离。
Master 进程:启动时的配置中枢与终身守护者
Master 进程是 Nginx 启动后最先运行且唯一以 root 权限(如需监听 80/443 端口)启动的进程。它不处理任何网络 I/O,只做四件核心事:
- 读取并校验
nginx.conf语法和逻辑,失败则直接退出; - 初始化共享资源:创建监听 socket、分配内存池、准备日志文件句柄、加载模块;
- 调用
fork()派生指定数量的 Worker 进程(由worker_processes控制),每个 Worker 继承监听 socket 的文件描述符; - 进入事件循环,持续监听系统信号,并通过非阻塞
waitpid(-1, &status, WNOHANG)回收已退出的 Worker。
Worker 进程:事件驱动的请求处理单元
Worker 进程以非特权用户(user 指令指定)运行,每个都是独立的单线程、异步非阻塞进程,专注处理连接和请求。它们之间无共享内存数据(除显式配置的 shared memory 外),彼此隔离:
- 通过内核提供的
accept_mutex机制竞争获取新连接,避免“惊群”; - 使用 epoll(Linux)、kqueue(BSD)等高效 I/O 多路复用机制,一个 Worker 可并发处理数千连接;
- 不响应
SIGHUP,只接收 Master 转发的控制信号(如SIGQUIT); - 退出分两类:主动(如收到 SIGQUIT,处理完当前请求后干净退出)与被动(崩溃、OOM、被 kill -9),后者会触发 Master 立即拉起新 Worker 补位。
信号驱动的生命周期管理
Master 是唯一接收外部信号的入口,所有运维操作都通过向 Master 发送标准 Unix 信号实现,无需重启进程:
-
kill -HUP $pid→ 重载配置:Master 重新解析配置,启动新 Worker,向旧 Worker 发SIGQUIT,旧 Worker 处理完存量请求后退出; -
kill -USR1 $pid→ 日志重开:通知所有 Worker 关闭并重新打开 access/error 日志文件,配合 logrotate 实现无缝切分; -
kill -USR2 $pid+kill -WINCH $old_pid→ 平滑升级:先启动新版 Master+Worker,再通知旧 Worker 逐步退出; -
kill -QUIT $pid→ 优雅停止:Master 向 Worker 发SIGQUIT,等待全部处理完毕后自身退出; -
kill -TERM $pid→ 快速终止:立即向 Worker 发SIGTERM,不等请求完成,Master 随即退出。
进程间通信与异常兜底机制
Master 与 Worker 不依赖复杂 IPC,通信极简:
- 信号是主要控制通道,轻量、可靠、操作系统原生支持;
- 必要时(如传递文件描述符或命令),使用
socketpair()创建一对 Unix 域 socket,传输ngx_channel_t结构体; - Master 对 Worker 异常退出有强兜底:只要检测到子进程 exit status 非零或未正常退出,就立即 fork 新进程补足
worker_processes数量,保障服务能力不降级; - 崩溃现场可通过 core dump(需开启)、error log 中的 “segmentation fault” 或 exit code 辅助定位。


















