nginx多进程架构靠“少量固定worker+事件驱动+cpu绑定”实现高效稳定,master仅加载配置、fork worker、监听信号、监控状态,不处理请求;worker独立异步非阻塞,单进程可支撑数万连接。

Nginx 的多进程架构不是靠堆数量来扛并发,而是靠“少量固定 Worker + 事件驱动 + CPU 绑定”实现高效稳定的服务能力。Master 不碰网络,Worker 各自为战,故障不扩散,配置可热更——这是它支撑万级并发的底层逻辑。
Master 与 Worker 的职责边界很清晰
Master 进程只做四件事:加载并校验配置、fork 出 Worker、监听信号(如 HUP 重载、USR1 切日志)、监控 Worker 状态。它不处理任何请求,也不参与 I/O,所以资源开销极低。一旦某个 Worker 异常退出,Master 会立刻拉起一个新的,服务持续在线。
Worker 进程完全独立,彼此不共享内存,也不用锁。每个 Worker 都有自己的事件循环、连接池、超时红黑树和 slab 内存分配器。一个请求进来,只会被某个 Worker 接收并全程处理完,不会跨进程流转。
Worker 数量不是越多越好
盲目设成 CPU 核数甚至更高,反而会拖慢性能:
- CPU ≥ 16 核时,推荐显式设置 worker_processes 8 或 12,而不是 auto 或全核数;
- 64 核机器跑 64 个 Worker,上下文切换频繁,L3 缓存失效严重;
- 搭配 worker_cpu_affinity auto,让系统按 NUMA 节点自动绑定,减少跨节点访问延迟;
- 启用 use epoll 和 multi_accept on,单次事件循环尽可能多地 accept 新连接,降低排队延迟。
单个 Worker 是怎么撑住几万连接的
每个 Worker 是单线程、异步非阻塞的,靠事件驱动模型压榨每一分 CPU:
- 所有 socket 操作(accept / recv / send)都是 non-blocking,遇到 EAGAIN 就立刻切走,不卡住;
- 连接结构体 ngx_connection_t 在启动时就预分配进连接池,复用不 malloc/free;
- 超时管理用红黑树,插入删除 O(log n),比轮询高效得多;
- HTTP 头部解析用 slab 分配器,字段指针直接引用原始 buffer,避免拷贝;
- keepalive 复用同一 socket 处理多个请求,省掉三次握手和 TLS 握手开销。
进程间协作靠信号和共享内存
Worker 之间不直接通信,但需要协同时通过两种机制:
- 共享内存:存放缓存元数据、限流计数器、session 状态等全局信息,配合原子操作(ngx_atomic_t)保证读写安全;
- 信号机制:Master 收到 HUP 后,通知所有 Worker 逐步退出;收到 USR1,触发所有 Worker 重新打开日志文件;
- 连接分配有 accept_mutex 控制,避免惊群效应,让新连接尽量均衡落到各 Worker 上。











