7.2.5 启停与平滑重载

本节聚焦 Nginx 的启动、停止与平滑重载,给出可执行示例、信号机制原理图、常见排错与练习,确保配置变更安全生效。

一、原理草图:启动/重载/退出的进程与信号流

文章图片

二、启动方式与前台/后台模式(含命令解释)
- 常规启动:读取默认配置

# 默认配置路径由编译参数决定
nginx
  • 指定配置文件:
nginx -c /etc/nginx/nginx.conf
# -c 指定配置文件绝对路径
  • 指定前缀目录(影响相对路径解析,如 logs/ 与 conf/):
nginx -p /usr/local/nginx
# -p 指定 Nginx 前缀目录
  • 前台运行(便于排错,容器常用):
nginx -g "daemon off;"
# -g 注入运行时指令,关闭守护进程模式

三、停止与退出策略(含实际效果)
- 快速停止(立即终止,可能中断请求):

nginx -s stop
# 等价发送 TERM 给主进程
  • 优雅退出(处理完当前请求再退出):
nginx -s quit
# 等价发送 QUIT 给主进程

四、平滑重载与热更新(完整示例流程)
- 语法检查 + 平滑重载(推荐流程):

nginx -t -c /etc/nginx/nginx.conf
# 预期输出: syntax is ok / test is successful

nginx -s reload
# 发送 HUP 信号,主进程启动新 workers
  • 热升级(二进制替换)示例步骤:
# 1) 备份旧二进制
cp /usr/sbin/nginx /usr/sbin/nginx.old

# 2) 替换新二进制(示意)
cp ./objs/nginx /usr/sbin/nginx

# 3) 触发新主进程(USR2)
kill -USR2 $(cat /var/run/nginx.pid)

# 4) 平滑关闭旧工作进程(WINCH)
kill -WINCH $(cat /var/run/nginx.pid.oldbin)

# 5) 确认进程切换
ps -ef | grep nginx | grep master

预期:出现新 master 进程(pid 与旧不同),旧 worker 逐步退出。

五、信号与 PID 管理(常见排错点)
- 常用信号与作用:
- TERM/INT:快速退出
- QUIT:优雅退出
- HUP:重载配置
- USR2:启动新主进程
- WINCH:优雅关闭工作进程
- PID 文件常见问题:

# 查看 PID 文件位置与配置是否一致
grep -n "pid" /etc/nginx/nginx.conf

# 检查 PID 文件是否存在
ls -l /var/run/nginx.pid

六、systemd 管理(服务化场景)

systemctl start nginx     # 启动
systemctl stop nginx      # 停止
systemctl reload nginx    # 平滑重载
systemctl status nginx    # 状态查看

若使用 systemd 管理,避免同时使用 nginx -s 反复控制,防止状态不一致。

七、故障排查示例(含命令与现象)
1) 重载失败:配置语法错误

nginx -t -c /etc/nginx/nginx.conf
# 输出示例: [emerg] unknown directive ...
# 处理:回滚配置或修正指令后再 reload

2) 重载无效:修改未生效

# 确认实际加载的配置
nginx -V 2>&1 | grep -- '--conf-path'
# 确认编辑的是正确的配置文件

3) 信号无效:PID 不一致

# 查看 master PID
ps -ef | grep "nginx: master" | grep -v grep
# 确认 nginx.pid 是否指向该 PID
cat /var/run/nginx.pid

八、练习(可操作)
1) 修改 nginx.confworker_processes,执行 nginx -tnginx -s reload,观察 ps -ef | grep nginx 的 worker 数量变化。
2) 使用 nginx -g "daemon off;" 前台启动,故意写错指令,观察错误输出并修复。
3) 模拟热升级:备份二进制并执行 USR2/WINCH 流程,确认旧 worker 平滑退出。