Nginx平滑升级需先备份旧二进制与配置,再用相同编译参数编译新版本,替换二进制后依次发送USR2、WINCH、QUIT信号完成新旧进程切换,全程不中断服务。

源码编译安装 Nginx 本身不支持“覆盖安装”这种一键替换操作,但可以通过手动方式安全升级到新版本,核心思路是:**保留旧配置、替换二进制与模块、平滑重启**。整个过程不会丢失原有配置、证书、日志路径等关键信息。
确认旧版本安装路径和配置结构
先弄清当前 Nginx 是怎么装的,避免误删或路径冲突:
- 运行 nginx -V(大写 V),查看 --prefix(安装根目录)、--conf-path(配置文件位置)、--modules-path(模块目录)等关键路径
- 检查 nginx -t 输出的配置文件是否在
/etc/nginx/nginx.conf或/usr/local/nginx/conf/nginx.conf等位置 - 记录当前启用的模块(如
http_ssl_module、http_v2_module),新编译时必须保持一致,否则 reload 会失败
下载并编译新版本源码
用和旧版本完全相同的 configure 参数重新编译,只是换源码包:
- 下载新稳定版(例如
nginx-1.30.2.tar.gz),解压后进入目录 - 执行 ./configure 命令——务必复用旧版的全部
--with-xxx和--without-xxx参数(可从nginx -V输出中复制) - 运行 make(不执行
make install!这步只生成新二进制)
替换二进制并验证
这是最关键的一步,确保服务不中断:
- 备份旧二进制:cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
- 替换新二进制:cp objs/nginx /usr/local/nginx/sbin/nginx
- 验证语法和模块兼容性:nginx -t —— 必须显示
success,否则说明模块参数不匹配 - 检查新旧版本:nginx -v 应显示新版本号
平滑升级并清理
利用 Nginx 自带的二进制热替换机制:
- 发送 USR2 信号启动新主进程:kill -USR2 `cat /var/run/nginx.pid`(路径以实际为准)
- 此时新旧两个 master 进程共存,用 ps aux | grep nginx 可看到
- 发送 WINCH 信号优雅关闭旧 worker:kill -WINCH `cat /var/run/nginx.pid.oldbin`
- 确认旧 master 退出后,发送 QUIT 关闭它:kill -QUIT `cat /var/run/nginx.pid.oldbin`
- 最后执行 nginx -s reload(可选,确保配置生效)
不复杂但容易忽略:只要 configure 参数一致、路径不变、配置未改动,整个升级过程对前端请求完全无感。


















