一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 如何平滑升级 Nginx 源码版本而不会中断线上业务

时间:2026-08-18 11:36:49 编辑:袖梨 来源:一聚教程网

平滑升级 Nginx 源码版本的核心是新旧 master 进程共存并通过 USR2、WINCH 等信号控制切换,全程不中断服务;需源码编译安装,严格复用旧版 configure 参数编译新二进制,再原子替换并按序发信号完成热切换。

平滑升级 Nginx 源码版本,核心是「新旧 master 进程共存 + 信号控制切换」,全程不 kill -9、不重启服务、不中断连接。关键不在替换文件本身,而在如何让新旧二进制协同工作。

确认当前环境并备份

先确保你用的是源码编译安装(dnf/yum/apt 安装的 nginx 不支持平滑升级),然后执行:

  1. 查旧版本参数:运行 /usr/local/nginx/sbin/nginx -V,记录 configure arguments 内容,新版本必须完全一致(比如 --with-http_ssl_module --with-http_stub_status_module
  2. 备份二进制和配置cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bakcp -r /usr/local/nginx/conf /usr/local/nginx/conf.bak.$(date +%Y%m%d)
  3. 确认 pid 文件位置:通常为 /usr/local/nginx/logs/nginx.pid,后续发信号依赖它

编译新版本(不 install)

下载新版本源码(如 nginx-1.30.4.tar.gz),解压后进入目录:

  1. 执行 ./configure [刚才记下的全部参数](例如:./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
  2. 运行 make不要 make install)——编译产物在 objs/nginx
  3. 验证新二进制可用:./objs/nginx -t(应显示 syntax ok)

替换+发信号完成热切换

切到安装目录,执行原子替换与信号控制:

  1. 备份并覆盖:mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old && cp objs/nginx /usr/local/nginx/sbin/
  2. 发送 USR2 启动新 masterkill -USR2 $(cat /usr/local/nginx/logs/nginx.pid) → 此时 ps aux | grep nginx 会看到两组进程(旧 master + 新 master)
  3. 发送 WINCH 关闭旧 workerkill -WINCH $(cat /usr/local/nginx/logs/nginx.pid) → 旧 worker 不再接受新请求,但继续处理已有长连接(如大文件下载、WebSocket)
  4. 确认切换完成:等旧 worker 全部退出(ps aux | grep 'nginx: worker process' 只剩新进程),再发 kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin) 关闭旧 master

验证与回滚准备

升级后立刻检查:

  1. 访问服务或 curl 测试响应头:curl -I http://your-domain/ | grep Server 确认版本号已更新
  2. 运行 /usr/local/nginx/sbin/nginx -t 验证配置仍有效
  3. 查看日志:tail -f /usr/local/nginx/logs/error.log 留意是否有 warning 或 failed
  4. 回滚只需一步:mv /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx && kill -HUP $(cat /usr/local/nginx/logs/nginx.pid.oldbin)

热门栏目