Nginx多进程通信由Master-Worker架构内建驱动,通过信号、UNIX域套接字和共享内存三种方式实现:信号用于进程控制(如SIGHUP平滑重启),UNIX域套接字用于Master向Worker下发结构化指令,共享内存用于跨Worker状态同步(如限流计数器),不支持阻塞式IPC机制。

Nginx 的多进程通信不是靠开发者手动编码实现的,而是由其 Master-Worker 架构内建驱动的协同机制。它不提供通用 IPC API,但通过信号、UNIX 域套接字(channel)、共享内存三种方式,在配置重载、状态同步、进程控制等关键环节自动协作。
信号:最轻量的进程控制通道
Master 与 Worker 之间最常用、最直接的通信手段是标准 Unix 信号,无需额外配置,只需发送对应信号即可触发预定义行为:
-
SIGHUP:执行
nginx -s reload或kill -HUP <master-pid>,主进程通知所有 Worker 平滑重启——关闭监听端口、处理完存量连接后,按新配置拉起新 Worker -
SIGUSR2:配合
nginx -s upgrade使用,主进程启动新版本 Worker,旧 Worker 继续服务直到自然退出 - QUIT / TERM / STOP:分别对应优雅退出、强制终止、重新打开日志文件等操作
UNIX 域套接字(channel):专用于命令下发的父子通道
每个 Worker 进程在 fork 时,Master 会调用 socketpair(AF_UNIX, SOCK_STREAM, 0, channel) 创建一对匿名套接字,将 channel[0] 留给自身,channel[1] 传给子进程。这条专属通道用于传递结构化控制指令:
- 消息格式为
ngx_channel_t,含command(如NGX_CMD_OPEN_CHANNEL、NGX_CMD_QUIT)、pid、slot和可选文件描述符 - Worker 启动后立即注册该 socket 为读事件,由
ngx_channel_handler解析并执行命令 - 该机制对用户透明,调试时可用
strace -p <worker-pid> -e trace=recvfrom,sendto观察收发过程
共享内存:跨 Worker 实现状态与统计共享
当多个 Worker 需要共用同一份数据(如限流计数器、连接总数、缓存命中率),Nginx 通过 shared memory 段统一管理:
- 由 Master 进程在启动阶段分配(基于
mmap封装的ngx_shm_alloc),所有 Worker 继承并映射同一块物理内存 - 典型配置如
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s,其中zone=one:10m即声明一块 10MB 共享内存 - 内部使用 Slab 分配器管理内存碎片,并配合原子操作(非互斥锁)保障并发安全,避免 Worker 阻塞
不推荐也不支持的通信方式
Nginx 明确规避传统阻塞式同步机制,因其会破坏事件驱动模型的高并发能力:
- Worker 中禁止使用
pthread_mutex_lock、sem_wait等会导致挂起的操作——一旦阻塞,整个 Worker 的事件循环停滞,所有待处理请求被“饿死” - 不依赖消息队列、管道或 FIFO;各 Worker 之间默认无直接通信需求,也未开放通用跨 Worker 消息接口
- 文件锁仅用于配置加载阶段的互斥校验,不用于运行时 IPC


















