Nginx Master进程通过信号、共享内存段和socketpair channel三类机制实现与Worker进程协同通信:信号用于轻量控制(如SIGHUP重载),共享内存用于状态共享(如限流计数器),socketpair channel支持双向命令交互(如NGX_CMD_OPEN_CHANNEL)。

Nginx 的 Master 进程本身不“定义”IPC 机制,而是通过内建架构和初始化阶段主动构建并启用三类协同通信方式:信号、共享内存段、基于 socketpair 的 channel 通道。这些机制在启动时由 Master 统一创建、分配和分发,Worker 进程启动后自动接入,全程无需用户手动编码。
用 signal 实现轻量控制指令
Master 与 Worker 之间最直接的通信依赖 Unix 信号。Master 不发送自定义消息,而是向 Worker 进程组广播标准信号:
- SIGHUP:触发平滑重载——Master 读新配置、fork 新 Worker、通知旧 Worker 优雅退出连接
- SIGUSR2:用于二进制热升级——Master 启动新版 Worker,旧版继续服务直到空闲后退出
- QUIT / TERM / STOP:分别对应优雅终止、强制杀进程、重开日志文件
用 shared memory 实现状态数据共享
当多个 Worker 需要共用运行时统计或限流状态(如 limit_req_zone 计数器、ssl_session_cache 缓存),Master 在初始化阶段调用 ngx_shm_alloc() 分配一块系统级共享内存,并将地址与元信息(大小、名称)写入全局结构体 ngx_shm_t。所有 Worker fork 后继承该映射,可直接读写同一块物理内存,无需复制或同步锁。
用 socketpair + channel 实现命令级双向交互
Master 在每次 fork 新 Worker 前,先调用 socketpair(AF_UNIX, SOCK_STREAM, 0, channel) 创建一对全双工 Unix 域套接字:
- 父进程(Master)保留
channel[0],关闭channel[1] - 子进程(Worker)继承两个 fd,关闭
channel[0],仅用channel[1]通信 - Master 向所有已有 Worker 发送
NGX_CMD_OPEN_CHANNEL消息,附带新 Worker 的pid和其channel[0]fd(通过SCM_RIGHTS辅助数据传递) - 各 Worker 收到后,即可持该 fd 与新 Worker 直接通信(如负载探测、连接迁移等高级场景)
通信结构体 ngx_channel_t 是统一消息载体
所有通过 channel 通道发送的指令都封装为 ngx_channel_t 结构体,含四个关键字段:
-
command:整型命令码(如
NGX_CMD_OPEN_CHANNEL、NGX_CMD_QUIT) - pid:目标或来源进程 ID
-
slot:该进程在全局
ngx_processes[]数组中的索引 - fd:可选的文件描述符(用于跨进程传递监听 socket 或日志句柄)


















