平滑升级nginx需严格复用旧版configure参数,仅替换二进制:先nginx -v获取--prefix、--conf-path及所有--with-xxx-module;新版本configure后make不install;备份旧sbin/nginx,复制objs/nginx覆盖;按usr2→winch→quit顺序发信号;验证版本、进程、功能及日志,异常时hup回滚。

平滑升级 Nginx 本身(不是后端服务)能做到完全不中断业务,但前提是必须用源码编译安装、且严格复用旧版 configure 参数——任何路径或模块差异都会导致新进程启动失败,直接卡在 USR2 阶段。
确认旧版本编译参数和运行状态
这步跳过就大概率升级失败。不能只看 nginx -v,必须用大写 V:
nginx -V 输出里重点关注三块:--prefix=(安装根路径)、--conf-path=(配置文件位置)、所有 --with-xxx-module(启用的模块)。比如旧版用了 --with-http_ssl_module,新版 configure 漏掉它,nginx -t 会报模块找不到。
还要确认当前是原生启动(/usr/local/nginx/sbin/nginx),不是 systemd 管理的:ps aux | grep nginx 看主进程命令行是否含 systemd ——如果是,kill -USR2 会被 systemd 拦截,根本不会触发新 master 启动。
编译新版本时只 make,绝不 make install
make install 会覆盖 conf/、html/ 等目录,导致配置丢失或静态文件被重置。正确流程是:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 进入新源码目录,用旧参数执行
./configure(例如./configure --prefix=/usr/local/nginx --with-http_ssl_module) - 运行
make(不是make install) - 新二进制只在
objs/nginx里,直接复制过去即可
替换前务必先备份:cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak。如果 cp 报 Text file busy,说明旧进程正占用该文件,这是正常现象——等后续发送 WINCH 后再覆盖也来得及。
发信号顺序不能错:USR2 → WINCH → QUIT
三个信号有严格依赖关系,中间不能跳步或颠倒:
-
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid):启动新 master + worker,此时ps aux | grep nginx应看到两组进程(旧 master + 新 master) -
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin):注意 PID 文件名是nginx.pid.oldbin,不是原nginx.pid;这个信号只关旧 worker,不碰旧 master -
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin):等旧 worker 全退出后(ps看不到旧 worker 进程了),再发 QUIT 让旧 master 退出
常见错误是误对新 PID 发 WINCH,结果把新 worker 关了,只剩旧 master 勉强撑着——表面没报错,但实际已降级为单点运行,且无法回滚。
验证和回滚的关键检查点
升级完成后别急着删备份,先做三件事:
- 查版本:
nginx -v必须显示新版本号;ps aux | grep nginx只剩一组进程(新 master + 新 worker) - 测功能:
curl -I http://localhost看响应头是否正常,尤其注意 HTTPS 站点要验证证书链和 ALPN 是否生效 - 盯日志:
tail -f /usr/local/nginx/logs/error.log,重点看有没有module not found或could not build the server_names_hash这类启动后才暴露的问题
回滚最简单:把备份的旧二进制拷回去,kill -HUP 旧 PID 即可——但前提是旧 master 还活着。一旦旧 master 被 QUIT 干掉,回滚就只能靠重启,这时备份的完整目录(如 /usr/local/nginx.bak)才是真正的救命稻草。










