Nginx Master进程使用Unix信号(如SIGTERM、SIGQUIT)而非信号量控制服务关闭;信号用于异步通知,信号量用于进程同步,二者技术本质不同。

Nginx 的 Master 进程并不使用信号量(semaphore)来控制服务关闭,而是通过标准的 Unix 信号(signal)机制与 Worker 进程通信。
Master 进程实际依赖的是信号,不是信号量
信号量(semaphore)是用于进程/线程间同步的内核对象,常用于互斥或资源计数;而 Nginx 使用的是异步事件通知机制——即 POSIX 信号(如 SIGTERM、SIGQUIT、SIGUSR2 等)。Master 进程收到外部信号后,负责转发或协调 Worker 进程的行为。
- SIGTERM:平滑停止(Graceful shutdown)——Master 向 Worker 发送 SIGQUIT,Worker 处理完当前请求后退出
- SIGQUIT:立即停止(非平滑)——Master 自身退出,Worker 收到 SIGQUIT 后尽快终止
- SIGHUP:重载配置——Master 读取新配置,启动新 Worker,优雅停掉旧 Worker
- SIGUSR2:平滑升级二进制文件(如升级 Nginx 版本)
为什么容易混淆“信号量”和“信号”
中文里“信号量”和“信号”名称接近,但技术含义完全不同:
- “信号(signal)”是操作系统向进程发送的轻量级异步通知(如 Ctrl+C 触发 SIGINT)
- “信号量(semaphore)”是用于控制多个进程/线程对共享资源访问的同步原语,Nginx 内部未用其做主从控制
- Nginx 源码中涉及信号处理的核心文件是
src/os/unix/ngx_process.c和src/core/ngx_signal.c,全部基于sigaction()等系统调用
如何验证 Nginx 使用的是信号
可通过命令行和系统工具观察:
- 执行
nginx -s quit,本质是向 Master 进程发送SIGQUIT(通过kill -QUIT $(cat nginx.pid)效果相同) - 用
strace -p $(cat nginx.pid)跟踪 Master 进程,可看到rt_sigaction()、sigwaitinfo()等信号相关系统调用 - 查看
/proc/$(cat nginx.pid)/status中的CapInh/CapPrm字段,不包含 IPC 相关能力(信号量属 System V IPC,需 CAP_IPC_OWNER)
真正用到信号量的场景在 Nginx 中极少
Nginx 设计强调无锁、事件驱动和多进程隔离。它避免使用信号量这类需要内核 IPC 支持的机制:
- 进程间共享状态靠文件(如 .pid、.lock)、共享内存(如 limit_req zone)或 socket 传递
- Worker 进程彼此独立,不直接竞争同一资源,无需信号量做互斥
- 第三方模块若需同步,一般用原子操作或文件锁(flock),而非信号量

















