推荐将 KillMode 设为 process 并设置 TimeoutStopSec=20,使 Nginx master 进程接收 SIGTERM 后自主协调 worker 优雅退出,避免连接强制中断;reload 操作不受 KillMode 影响。

在 Linux 下使用 systemd 管理 Nginx 服务时,KillMode 决定了 systemd 如何终止 Nginx 进程,直接影响主进程与工作进程的退出行为。默认值(control-group)通常适用,但若遇到 Nginx 无法干净关闭、残留 worker 进程或 reload 失败等问题,可能需要调整。
KillMode 的常见取值及对 Nginx 的影响
Nginx 是典型的主从架构:一个 master 进程监听信号,多个 worker 进程处理请求。systemd 的 KillMode 控制的是“向哪些进程发送 SIGTERM/SIGKILL”:
- control-group(默认):向整个 cgroup 中所有进程(master + 所有 worker)同时发送终止信号。Nginx master 通常来不及优雅关闭 worker,可能导致连接被强制中断。
- process:只向主进程(即启动时 exec 的那个进程)发送信号。Nginx master 收到 SIGTERM 后会自行触发优雅退出流程(关闭监听、等待 worker 处理完请求后退出),更符合 Nginx 原生设计。
- mixed:向主进程发 SIGTERM,向其余进程(worker)发 SIGQUIT —— 这个组合对 Nginx 不推荐,SIGQUIT 可能导致非预期中止。
- none:不发送任何信号,完全依赖服务自身逻辑或外部清理,一般不用。
推荐配置:设为 process 并配合 TimeoutStopSec
要让 Nginx 实现真正优雅停止,建议在自定义 service 文件中明确设置:
[Service] KillMode=process TimeoutStopSec=30
说明:
- KillMode=process 确保只有 master 进程收到 SIGTERM,由它协调 worker 优雅退出;
- TimeoutStopSec=30 给足 master 关闭时间(默认 90 秒太长,10–30 秒对多数场景更合理),超时后 systemd 才会 fallback 发送 SIGKILL;
- 无需额外写 ExecStop=,因为 Nginx master 对 SIGTERM 的响应已内置支持优雅退出。
如何修改并生效
步骤如下(以标准安装为例):
- 复制默认 unit 文件到本地覆盖目录:
sudo systemctl edit nginx(推荐,避免直接改 /usr/lib/systemd/system/nginx.service) - 在编辑器中输入:
[Service] KillMode=process TimeoutStopSec=20
- 保存退出,重载配置:
sudo systemctl daemon-reload - 验证是否生效:
systemctl show nginx | grep -E "(KillMode|TimeoutStopSec)" - 测试效果:
sudo systemctl stop nginx && ps aux | grep nginx,应无残留 worker 进程。
补充说明:reload 与 KillMode 无关
systemctl reload nginx 实际执行的是 nginx -s reload,由 master 进程内部完成(生成新 worker、逐步停旧 worker),不受 KillMode 影响。KillMode 仅作用于 stop 和 restart 操作。若 reload 异常,应检查配置语法、权限或 pid 文件路径,而非 KillMode。

















