Linux下Nginx源码平滑升级不中断业务的关键是只替换二进制、复用旧编译参数、按USR2→WINCH→QUIT顺序发信号;须先nginx -V获取完整configure参数,make不install,备份后覆盖sbin/nginx,再验证并回滚。

Linux 下通过源码升级 Nginx 实现不中断服务,关键在于「只替换二进制、复用旧配置、靠信号切换进程」。整个过程不重启服务、不丢请求,前提是必须源码安装且严格复用旧版编译参数。
确认旧版本参数和运行方式
这一步跳过,后续极大概率失败。
- 执行 nginx -V(大写 V),重点抄下整行 --configure arguments,包括
--prefix=、--conf-path=和所有--with-xxx-module - 检查是否由 systemd 管理:
ps aux | grep nginx,若主进程命令含systemd,需临时改用原生启动(否则kill -USR2会被拦截) - 记下 PID 文件路径(通常是
/usr/local/nginx/logs/nginx.pid),并确认该文件可读
编译新版本二进制(不安装)
目标是生成一个兼容的 objs/nginx,而非覆盖整个安装目录。
- 下载新源码包(如
nginx-1.30.4.tar.gz),解压后进入目录 - 用旧参数执行 ./configure(例如:
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module) - 运行 make(千万不能
make install,否则会覆盖 conf/、html/ 等目录) - 编译完成后,新二进制位于
objs/nginx
备份、替换与信号切换
操作顺序不可颠倒,否则可能只剩单点运行或无法回滚。
- 备份旧二进制:
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak - 复制新二进制:
cp objs/nginx /usr/local/nginx/sbin/nginx - 验证语法:
/usr/local/nginx/sbin/nginx -t必须显示 syntax is ok - 发 USR2 启动新 master:
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)(此时 ps 可见两组 master + worker) - 发 WINCH 关旧 worker:
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin)(注意是.oldbin文件) - 等旧 worker 全退出后,发 QUIT 关旧 master:
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
验证与异常处理
升级完成不等于可用,必须快速确认核心指标。
- 查版本:
nginx -v应返回新版本号 - 查进程:
ps aux | grep nginx应只剩新 master 及其 worker - 测业务:用
curl -I或访问真实接口,确认 HTTP 状态、响应头、SSL 功能正常 - 看日志:
tail -f /usr/local/nginx/logs/error.log,排查模块加载失败或配置警告 - 若异常,立即回滚:
cp /usr/local/nginx/sbin/nginx.bak /usr/local/nginx/sbin/nginx && kill -HUP $(cat /usr/local/nginx/logs/nginx.pid)


















