在 CentOS 7 环境下对 Nginx 进行编译升级或添加模块时,可以通过以下方法实现不影响业务的热重启(无缝升级):
1. 准备工作
1.1 安装必要工具
yum install -y gcc make openssl-devel pcre-devel zlib-devel
1.2 获取当前编译参数
nginx -V 2>&1 | grep 'configure arguments'
重要:记录下所有配置参数,后续编译需要使用完全相同的参数。
2. 热升级步骤
2.1 下载相同/新版本源码
# 获取当前版本
nginx -v
# 下载源码(保持相同版本或升级)
wget http://nginx.org/download/nginx-1.20.2.tar.gz
tar zxvf nginx-1.20.2.tar.gz
cd nginx-1.20.2
2.2 配置编译参数(添加新模块)
./configure [之前记录的所有参数] --add-module=/path/to/new_module
2.3 编译新版本
make # 不要执行make install
2.4 备份旧二进制文件
cp /usr/sbin/nginx /usr/sbin/nginx.old
2.5 替换新二进制文件
cp objs/nginx /usr/sbin/nginx
3. 热重启关键操作
3.1 向主进程发送USR2信号
kill -USR2 `cat /var/run/nginx.pid`
这会启动新的Nginx主进程和工作进程,新旧进程会并行运行。
3.2 向旧主进程发送WINCH信号
kill -WINCH `cat /var/run/nginx.pid.oldbin`
这会优雅关闭旧的工作进程,保留主进程以防回滚。
3.3 验证新进程
ps -ef | grep nginx
确认新进程正常运行且服务正常。
4. 最终确认或回滚
4.1 如果确认新版本正常
kill -QUIT `cat /var/run/nginx.pid.oldbin`
彻底关闭旧的主进程。
4.2 如果需要回滚
kill -HUP `cat /var/run/nginx.pid.oldbin` # 重启旧工作进程
kill -QUIT `cat /var/run/nginx.pid` # 关闭新主进程
5. 自动化脚本示例
#!/bin/bash
# 编译新版本
cd nginx-1.20.2
make
# 备份并替换
mv /usr/sbin/nginx /usr/sbin/nginx.old
cp objs/nginx /usr/sbin/nginx
# 热重启
kill -USR2 `cat /var/run/nginx.pid`
sleep 5
kill -WINCH `cat /var/run/nginx.pid.oldbin`
echo "升级完成,请验证服务"
echo "确认无误后执行: kill -QUIT `cat /var/run/nginx.pid.oldbin`"
注意事项
- 版本兼容性:确保新旧版本之间的配置兼容
- 模块兼容性:新增模块必须与当前Nginx版本兼容
- 长连接处理:配置中应有
worker_shutdown_timeout
参数 - 日志分割:USR2信号也会重新打开日志文件,确保日志权限正确
- 监控:操作后密切监控服务器状态和错误日志
验证方法
# 检查版本
nginx -v
# 检查进程
ps -ef | grep nginx
# 检查错误日志
tail -f /var/log/nginx/error.log
这种热重启方式可以在不中断服务的情况下完成Nginx的升级或模块添加,特别适合生产环境使用。