最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Nginx 如何平滑升级 Nginx 源码版本而不会中断线上业务
时间:2026-08-18 11:36:49 编辑:袖梨 来源:一聚教程网
平滑升级 Nginx 源码版本的核心是新旧 master 进程共存并通过 USR2、WINCH 等信号控制切换,全程不中断服务;需源码编译安装,严格复用旧版 configure 参数编译新二进制,再原子替换并按序发信号完成热切换。
平滑升级 Nginx 源码版本,核心是「新旧 master 进程共存 + 信号控制切换」,全程不 kill -9、不重启服务、不中断连接。关键不在替换文件本身,而在如何让新旧二进制协同工作。
确认当前环境并备份
先确保你用的是源码编译安装(dnf/yum/apt 安装的 nginx 不支持平滑升级),然后执行:
-
查旧版本参数:运行
/usr/local/nginx/sbin/nginx -V,记录configure arguments内容,新版本必须完全一致(比如--with-http_ssl_module --with-http_stub_status_module) -
备份二进制和配置:
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak;cp -r /usr/local/nginx/conf /usr/local/nginx/conf.bak.$(date +%Y%m%d) -
确认 pid 文件位置:通常为
/usr/local/nginx/logs/nginx.pid,后续发信号依赖它
编译新版本(不 install)
下载新版本源码(如 nginx-1.30.4.tar.gz),解压后进入目录:
- 执行
./configure [刚才记下的全部参数](例如:./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module) - 运行
make(不要 make install)——编译产物在objs/nginx - 验证新二进制可用:
./objs/nginx -t(应显示 syntax ok)
替换+发信号完成热切换
切到安装目录,执行原子替换与信号控制:
- 备份并覆盖:
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old && cp objs/nginx /usr/local/nginx/sbin/ -
发送 USR2 启动新 master:
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)→ 此时ps aux | grep nginx会看到两组进程(旧 master + 新 master) -
发送 WINCH 关闭旧 worker:
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid)→ 旧 worker 不再接受新请求,但继续处理已有长连接(如大文件下载、WebSocket) -
确认切换完成:等旧 worker 全部退出(
ps aux | grep 'nginx: worker process'只剩新进程),再发kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)关闭旧 master
验证与回滚准备
升级后立刻检查:
- 访问服务或 curl 测试响应头:
curl -I http://your-domain/ | grep Server确认版本号已更新 - 运行
/usr/local/nginx/sbin/nginx -t验证配置仍有效 - 查看日志:
tail -f /usr/local/nginx/logs/error.log留意是否有 warning 或 failed - 回滚只需一步:
mv /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx && kill -HUP $(cat /usr/local/nginx/logs/nginx.pid.oldbin)