首页 > Sysadmin > 正文

Linux 系统停止 Nginx 的四种方法

huyuanwen 2026-11-01 Sysadmin

草稿待审;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 会停再启,有毫秒级中断。

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。