插件窝 干货文章 nginx怎么实现平滑重启

nginx怎么实现平滑重启

Nginx 配置 进程 重启 669    来源:    2025-04-27

Nginx 实现平滑重启(Graceful Restart)可以通过以下步骤完成,确保在不中断服务的情况下重新加载配置或升级程序:


核心命令:nginx -s reload

sudo nginx -s reload
# 或指定配置文件路径
sudo nginx -s reload -c /etc/nginx/nginx.conf

平滑重启的原理

  1. 主进程(Master Process) 接收到 reload 信号后:
    • 检查新配置文件的语法是否正确。
    • 如果配置正确,启动新的 Worker 进程(加载新配置)。
    • 旧 Worker 进程继续处理已建立的连接,直到请求完成后再退出。
  2. 零停机时间:新旧 Worker 进程交替,确保用户无感知。

完整操作步骤

  1. 测试配置文件语法(避免重启失败):

    sudo nginx -t
    

    输出 syntax is ok 表示配置正确。

  2. 执行平滑重启

    sudo nginx -s reload
    
  3. 验证新配置生效

    sudo nginx -T  # 查看当前运行的配置
    ps aux | grep nginx  # 检查新旧Worker进程交替
    

其他相关命令

命令 作用
nginx -s stop 强制停止(不优雅)
nginx -s quit 优雅停止(处理完当前请求)
nginx -s reopen 重新打开日志文件

注意事项

  1. 权限问题:确保执行命令的用户有权限(通常需 sudo)。
  2. 长连接处理:如果配置了长连接(如 WebSocket),旧 Worker 会保持直到超时。可通过调整 worker_shutdown_timeout 控制超时时间。
  3. 二进制升级:如需升级 Nginx 版本,需替换二进制文件后通过 kill -USR2 信号实现热升级(需结合 nginx-upgrade 脚本)。

扩展:手动发送信号

如果 nginx -s 不可用,可直接向主进程发送信号:

# 获取Nginx主进程ID
ps -ef | grep nginx | grep master

# 发送HUP信号(等效于reload)
sudo kill -HUP <MASTER_PID>

通过以上方法,Nginx 可以实现真正的平滑重启,确保服务高可用性。遇到问题可结合 error.log 排查。