nginx源码升级核心是仅替换sbin/nginx二进制文件,严格复用旧版configure参数编译新版本、make不install、备份后覆盖并按usr2→winch→quit发信号完成热切换。

源码编译安装的 Nginx 升级新版本,核心是「只换二进制,不动配置」。只要不执行 make install,原有 conf/、html/、logs/ 等目录就完全不受影响,配置文件、SSL证书、自定义模块路径全部保留。
一、先确认旧版编译参数
这是最关键的一步,漏掉就可能升级失败:
- 运行
nginx -V(大写 V),不是-v - 重点抄下整行
configure arguments:后面的内容,包括:
--prefix=(安装根目录)、
--conf-path=(配置文件路径)、
所有 --with-xxx-module(比如--with-http_ssl_module)、
第三方依赖路径(如--with-openssl=/path/to/openssl)
二、编译新版本但不安装
解压新源码包后,严格复用上一步拿到的全部参数:
- 进入新源码目录,执行:
./configure [粘贴刚才抄的全部参数] - 接着只运行:
make(千万不能make install) - 编译完成后,新二进制就在
objs/nginx里
三、安全替换二进制文件
只动 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(必须显示 success)
四、发信号完成热升级
不重启、不中断请求,靠信号触发新旧进程交替:
- 启动新 master:
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid) - 等旧 worker 退出后,优雅关停旧 master:
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin)kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin) - 检查进程:
ps aux | grep nginx应只剩新 master 和它的 worker
整个过程配置零改动、日志不断流、连接不重置。异常时可立刻 kill -HUP 回滚到旧版,风险可控。











