一、 概述
在生产环境下,升级 NGINX 二进制文件通常面临一个挑战:如何升级而不需要停止服务(零停机)?
NGINX 通过一套精巧的信号量(Signals)机制实现了平滑升级。其核心原理是:启动一个新的主进程(Master Process)接管监听端口,让旧进程在处理完现有请求后优雅退出,从而实现无缝切换。
二、 升级前置准备与环境摸底
在升级之前,必须确保新版本的编译参数与当前运行的版本完全一致,否则会导致启动失败或功能缺失。
1. 查询当前版本及编译参数
# 查看当前版本号
nginx -v
# 查看详细编译参数 (极其重要,升级时必须使用相同的参数)
nginx -V记录项: 重点记录 configure arguments 之后的所有内容(如 --prefix=/usr/local/nginx)。
2. 确认二进制文件路径与 PID
# 确认 nginx 可执行文件路径
which nginx
# 确认当前运行的主进程 PID
ps aux | grep nginx
记录项: 记录 master process 的 PID。3. 配置文件语法检查
在任何操作前,确保当前配置文件没有语法错误。
nginx -t三、 新版本编译准备
核心原则:只编译→→不安装。 严禁直接执行 make install,因为这会覆盖您生产环境的配置文件。
1. 下载并解压
wget http://nginx.org/download/nginx-x.x.x.tar.gz
tar -zxvf nginx-x.x.x.tar.gz
cd nginx-x.x.x2. 配置与编译
使用第一阶段记录的编译参数进行配置:
# 使用之前 nginx -V 记录的参数
./configure --prefix=/usr/local/nginx [其他参数...]
# 编译生成二进制文件
make编译完成后,新的二进制文件位于 objs/nginx。
四、 执行平滑升级(核心步骤)
步骤 1:二进制文件替换
由于 Linux 内核禁止覆盖正在运行的二进制文件(会报 Text file busy),我们必须使用 mv 命令通过改变 inode 的方式进行替换。
# 1. 备份旧文件
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
# 2. 使用 mv 替换新文件 (绕过 Text file busy)
mv objs/nginx /usr/local/nginx/sbin/nginx
# 3. (可选) 如果系统中有快捷路径 /usr/local/bin/nginx,请同步更新
cp /usr/local/nginx/sbin/nginx /usr/local/bin/nginx步骤 2:启动新主进程 (USR2)
向旧主进程发送 USR2 信号,通知其启动新版本的二进制进程。
kill -USR2 <旧MasterPID>
状态: 此时,旧主进程和新主进程同时存在,它们共同监听端口,但新请求将开始分发给新进程。
步骤 3:优雅停止旧工作进程 (WINCH)
向旧主进程发送 WINCH 信号,通知旧的工作进程(Worker Processes)在处理完当前请求后立即退出。
code Bash
kill -WINCH <旧MasterPID>
状态: 此时,所有新流量已全部由新版本进程处理。
评论 (0)