Nginx必须通过master进程协调关闭,不能直接kill -9:否则worker变孤儿进程持续占用资源;正确方式是用nginx -s quit或kill -QUIT发信号,由master通知worker优雅退出。

Master Process 本身不“处理”强制杀进程,而是被强制杀掉的对象之一。当你用 kill -9 或 killall -9 nginx 直接终结 Master 进程时,它没有机会执行清理逻辑——所有 Worker 进程会变成孤儿进程,继续运行、占用端口、消耗资源,直到系统回收或手动清理。
为什么不能只杀 Worker 进程
Worker 进程由 Master 派生并监管。一旦你单独 kill 某个 Worker:
- Master 会立刻检测到子进程退出,并立即 fork 一个新的 Worker 补位
- 看似杀了一个,实际很快又出现一个,根本杀不完
- 频繁退出/重启 Worker 还可能引发日志刷屏、连接中断、accept 队列堆积等问题
正确停止 Nginx 的顺序
优先走信号机制,让 Master 主动协调关闭:
-
nginx -s stop:发送 SIGTERM 给 Master,它会通知所有 Worker 优雅退出(处理完当前请求再关) -
nginx -s quit:类似 stop,但更强调“立即退出”,不等新连接,仍保证已有请求完成 -
kill -QUIT $(cat /run/nginx.pid):效果同nginx -s quit,适用于 PID 文件路径非默认时
必须强制杀时的可靠做法
当 Master 已僵死、无响应或 PID 文件丢失,才考虑强制终止:
- 先查全进程:
ps -ef | grep nginx | grep -v grep,确认 master 和所有 worker 的 PID - 一次性杀光:
kill -9 <master_pid><worker_pid1><worker_pid2> ...</worker_pid2></worker_pid1></master_pid> - 或更省事:
killall -9 nginx(确保系统装有procps工具) - 杀完后检查端口是否释放:
ss -tlnp | grep ':80',若仍有残留,说明还有未被 kill 的 nginx 实例
杀完之后要做的事
强制杀进程只是应急手段,后续必须补操作,否则下次启动会失败:
- 删除旧 PID 文件:
rm -f /run/nginx.pid(或你配置的 pid 路径) - 验证配置:
nginx -t - 干净启动:
nginx - 观察进程树:
ps -ef | grep nginx,确认是 1 个 master + N 个 worker 的标准结构











