Nginx源码升级核心是只替换二进制文件、复用原configure参数、通过USR2→WINCH→QUIT信号实现零中断切换;必须用nginx -V获取完整参数,make不install,备份旧sbin/nginx,-t验证后再发信号。

源码编译安装的 Nginx 升级,核心是「只换二进制、不动配置、不中断服务」。不需要重装、不改 conf 目录、也不用重新初始化环境,重点在复用原编译参数和信号控制进程切换。
确认当前版本和完整编译参数
先查清楚旧版本怎么装的,这是升级不翻车的前提:
- 运行 nginx -v 看当前版本号(比如 nginx/1.22.1)
- 务必运行 nginx -V(大写 V),它会输出一整行 configure 参数,包括 --prefix=、--conf-path=、所有启用的模块(如 --with-http_ssl_module)等
- 记下这些参数——新版本 configure 必须完全一致,否则模块加载失败或路径错乱
下载、编译新版本(不 install)
新源码不能直接 make install,否则会覆盖 conf、html、logs 等目录,导致配置丢失:
- 下载目标版本(如 nginx-1.30.2.tar.gz),解压后进入目录
- 用原参数执行 ./configure(可追加新模块,但不要删已有模块)
- 执行 make(只生成 objs/nginx,不执行 make install)
备份并替换二进制文件
升级本质就是换掉 sbin/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,必须显示 test is successful
发送信号完成热升级
靠系统信号触发双 master 并行,实现零停机切换:
- 发 USR2 启动新 master:kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)
- 此时 ps 可见两个 master 进程;再发 WINCH 给旧 master(PID 来自 nginx.pid.oldbin),让它优雅关闭 worker
- 确认旧 worker 退出后,发 QUIT 给旧 master(同上 oldbin PID),彻底清理旧进程
- 最终只剩新 master 及其 worker,服务全程在线
升级后立即检查 nginx -v、访问业务接口、查看 error.log 是否有警告。若异常,用 kill -HUP 可快速回滚到旧二进制行为(前提是没删 nginx.bak)。


















