Linux下Nginx源码升级需保留原配置、平滑替换二进制、避免中断服务:1.用nginx -V获取原编译参数,新版本configure保持路径与模块一致,make不install;2.备份并替换sbin/nginx,-t验证;3.通过USR2、WINCH、QUIT信号完成热加载;4.验证版本、功能及日志,异常时HUP回滚。

Linux下Nginx源码安装后升级版本,核心是「保留原配置、平滑替换二进制、避免服务中断」。不建议直接覆盖旧文件,也不推荐用包管理器混用(如已源码安装却用apt/yum升级),否则易引发配置丢失或路径冲突。
1. 下载并编译新版本Nginx
先确认当前运行版本和编译参数,这对新版本兼容性很关键:
nginx -V # 注意是大写V,会输出完整configure参数
记下输出中的 --prefix=、--conf-path=、--modules-path= 等路径,以及启用的模块(如--with-http_ssl_module)。新编译必须保持相同路径,否则配置文件或模块加载会失败。
下载新源码(例如 nginx-1.24.0)并解压后,按原参数重新 configure(可追加新模块,但不要删已有模块):
- cd /path/to/nginx-1.24.0
- ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --with-http_ssl_module ...(粘贴原参数)
- make # 不要 make install
2. 备份旧二进制并替换
升级本质是替换 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)
3. 平滑升级(热加载)
不中断服务的关键步骤:
- 向主进程发送 USR2 信号,启动新 master 进程:kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
- 此时会有两个 master 进程(旧+新)和各自 worker;用 ps aux | grep nginx 可确认
- 给旧 master 发送 WINCH 信号,优雅关闭其 worker:kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`
- 确认旧 worker 已退出,再发 QUIT 给旧 master:kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
完成后只剩新 master 和其 worker,服务全程未中断。
4. 验证与清理
检查实际运行版本和功能是否正常:
- nginx -v # 应显示新版本号
- curl -I http://localhost 或访问业务接口,确认响应正常
- 查看 error.log 是否有模块加载失败、配置警告等
- 可选:删除旧二进制备份(nginx.bak)和 oldbin pid 文件
若升级异常,立即执行 kill -HUP `cat /usr/local/nginx/logs/nginx.pid.oldbin` 可快速回滚到旧版本。










