nginx 使用的是 unix 信号(signal),不是信号量(semaphore);前者用于异步进程控制,后者用于同步资源互斥;所有服务管理操作均通过向 master 进程发送标准信号实现。

准确说,Nginx 使用的是 Unix 信号(Signal),不是“信号量(Semaphore)”。这两个概念在操作系统中完全不同:信号是异步通知机制,用于进程控制;信号量是同步原语,用于资源互斥。Nginx 所有服务管理操作——停止、重启、重载、日志轮转——都依赖向 master 进程发送标准信号来实现。
怎么找到 Nginx master 进程的 PID
所有信号操作的前提是知道 master 进程 ID。它只有一个,且必须精准获取:
- 优先读取 pid 文件:默认路径为 /var/run/nginx.pid 或 /usr/local/nginx/logs/nginx.pid,执行
cat /var/run/nginx.pid即可得到数字 - 备用方法用 ps 过滤:运行
ps -ef | grep "nginx: master",第一列数字就是 PID;注意跳过带grep的那行 - 若 pid 文件不存在,说明 Nginx 没启动成功,或配置中指定了自定义 pid 路径(如
pid /opt/my-nginx.pid;),需按实际 nginx.conf 查找
停止服务:quit 是推荐方式,stop 和 kill -9 要慎用
停止不是简单终止,关键是保障正在处理的请求不中断:
-
nginx -s quit:最安全。自动读 pid 文件并发送 SIGQUIT,worker 完成当前请求后退出,master 随后关闭 -
nginx -s stop或kill -TERM $PID:发送 SIGTERM,master 立即终止,worker 被强制中止,可能丢数据或返回 502 -
kill -9 $PID:绝对避免。绕过 Nginx 自身清理逻辑,易残留 worker 进程、锁文件或未刷新的日志
重载配置:reload 实现零停机更新
日常“重启”几乎不需要 stop + start,nginx -s reload 就够了:
- 它本质是发 SIGHUP 信号给 master
- master 先校验新配置(语法 + 文件权限),失败则报错,旧服务完全不受影响
- 验证通过后,拉起新 worker 进程,再通知旧 worker 优雅退出;可通过
ps aux | grep nginx观察到新旧 worker 并存状态
实用辅助命令:reopen 和 t 不该被忽略
运维中高频但常被跳过的两个动作:
-
nginx -s reopen:等效于 SIGUSR1,让 master 和所有 worker 关闭并重新打开 access_log/error_log 文件,配合 logrotate 做日志切割时必备 -
nginx -t:每次改完 nginx.conf 后必跑。只检查配置语法和路径有效性,不加载也不影响线上服务;确认通过再 reload,能大幅降低故障率











