草稿待审;WSL 环境 apt 安装 nginx 超时,命令未实际执行,基于官方文档核查。
按 systemd、nginx 命令、kill 信号、service 四类方法停止 Nginx,区分立即停止与优雅退出,并附回滚步骤。
一、systemctl stop/quit
Systemd 下最常用,推荐默认先 quit 再 stop:
sudo systemctl quit nginx # 优雅退出,等现有请求结束
sudo systemctl stop nginx # 立即停止,会断连接
quit 只发 SIGQUIT;stop 发 SIGTERM。两者都依赖 systemd 管理的 nginx 服务[1][2]。
二、nginx -s 命令
直接调用 nginx 二进制发信号,不依赖 systemd:
sudo nginx -s quit # 优雅退出
sudo nginx -s stop # 立即停止
需要知道 nginx.pid 文件位置(默认 /run/nginx.pid 或 /usr/local/nginx/logs/nginx.pid)。若 pid 文件不在默认路径,用 -c 指定配置或 -p 指定前缀[3]。
三、kill 直接发信号
找到主进程 PID 后直接发信号:
MASTER_PID=$(cat /run/nginx.pid)
kill -QUIT $MASTER_PID # 优雅退出
kill -TERM $MASTER_PID # 立即停止
kill -INT $MASTER_PID # 等同于 TERM,快速关停
主进程 PID 也可通过 pgrep -f 'nginx: master process' 或 ps aux | grep 'nginx: master' 确认。注意只 kill 主进程,worker 会由 master 自行回收[1]。
四、service 传统命令
SysVinit 遗留方式,兼容旧版系统:
sudo service nginx quit
sudo service nginx stop
实际效果与 systemctl 一致,只是调用链不同。
—
排错速查表
| 现象 | 原因 | 处理 |
|---|---|---|
systemctl: command not found |
容器/精简环境无 systemd | 用 nginx -s 或 kill |
no pid file |
pid 路径被改过 | nginx -t 输出里有 pid 路径 |
job failed |
有 worker 卡死 | kill -KILL <worker-pid> 清理 |
permission denied |
当前用户不在 sudoers | 切 root 或用对应服务用户 |
—
回滚 / 撤销
停止后需要恢复:
sudo nginx # 直接启动(读取默认配置)
sudo nginx -c /etc/nginx/nginx.conf # 指定配置启动
sudo systemctl start nginx # systemd 启动
若改过配置导致无法启动,先 nginx -t 校验语法,再 systemctl status nginx 看报错。
—
局限性
- WSL2 内 systemd 支持有限,部分环境
systemctl不可用,需改用nginx -s。 - 容器环境通常由进程管理器(supervisord、tini)接管,直接 kill PID 1 会导致容器退出。
- 发送
SIGKILL会跳过 worker 优雅退出,可能丢失正在写入的日志或未 flush 的缓冲区。
实测记录
- 测试机:WSL2 Ubuntu 24.04.4 LTS、内核 6.6.114.1-microsoft-standard-WSL2;2026-11-01。
- apt 安装 nginx 超时,所有命令基于官方文档核查,尚未实际执行。
常见提问
systemctl stop和nginx -s stop有什么区别?前者走 systemd,后者直接发信号;效果相同,但 systemctl 会先停 service 依赖。- 优雅退出时新连接怎么办?Nginx 主进程收到
SIGQUIT后停止接受新连接,等旧连接处理完再退出 worker。 - 为什么不能直接 kill worker 进程?Worker 由 master 管理,kill worker 后 master 会重启它;只有发给 master 的信号才会真正停止服务。
- 容器里怎么优雅停 Nginx?给 PID 1 发
SIGQUIT,或通过nginx -s quit;不要kill -9。 - reload 和 restart 有什么区别?reload 热更新配置,不丢连接;restart 会停再启,有毫秒级中断。
参考资料
- [1] Control nginx – nginx.org(Nginx 控制文档)
- [2] Start nginx – nginx command line switches(Nginx 命令参考)
- [3] nginx(8) – Linux manual page(Debian nginx(8) manpage)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。