Nginx优雅退出不依赖信号量,而是通过主进程收SIGQUIT后关闭监听套接字、经channel socket向worker发送QUIT指令,worker轮询响应并处理完现存任务后退出。

Nginx 的优雅退出(graceful shutdown)并不依赖信号量(semaphore),而是通过进程间通信和主从进程协作机制实现的。信号量是用于线程/进程同步的底层 IPC 原语,但 Nginx 在优雅退出中并未使用它——这是常见的概念混淆。
主进程如何触发优雅退出
当收到 SIGQUIT 信号时,主进程启动退出流程:
- 停止接受新连接,关闭监听套接字(但已建立的连接仍保持)
- 向所有 worker 进程发送 QUIT 指令(通过已建立的 channel socket,非信号)
- 开始等待 worker 进程主动退出;若超时(默认 10 秒),则强制终止(SIGKILL)
worker 进程如何响应退出指令
worker 不直接响应系统信号,而是轮询主进程发来的指令:
- 收到 QUIT 指令后,标记自身进入“退出中”状态(
ngx_exiting = 1) - 不再 accept 新连接,但继续处理已入队的请求、定时器、事件和已有连接上的读写
- 待所有活跃连接自然关闭(或超时)、所有任务完成,调用
ngx_worker_process_exit()清理资源并退出
为什么不用信号量
Nginx 的设计强调轻量与可移植性:
- worker 进程间无共享内存,不需互斥访问临界资源,故无需信号量同步
- 主-从通信走的是 Unix domain socket(channel),指令传递可靠且有序
- 退出逻辑是单向协调(主→worker),非多进程竞争同一资源,信号量在此场景冗余且增加复杂度
实际操作中的关键点
执行 nginx -s quit 或 kill -QUIT $(cat nginx.pid) 后需注意:
- 确保 worker 进程没有卡在阻塞系统调用(如慢后端未响应),否则会拖长退出时间
- 可通过
nginx -s reload触发平滑升级,其退出旧 worker 的流程与quit类似 - 查看
error.log中 “exiting”、“exit” 日志,确认各 worker 是否正常终止










