CentOS 7 下 Nginx 编译后热重启方案

在 CentOS 7 环境下对 Nginx 进行编译升级或添加模块时,可以通过以下方法实现不影响业务的热重启(无缝升级):

1. 准备工作

1.1 安装必要工具

bash 复制代码
yum install -y gcc make openssl-devel pcre-devel zlib-devel

1.2 获取当前编译参数

bash 复制代码
nginx -V 2>&1 | grep 'configure arguments'

重要:记录下所有配置参数,后续编译需要使用完全相同的参数。

2. 热升级步骤

2.1 下载相同/新版本源码

bash 复制代码
# 获取当前版本
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 配置编译参数(添加新模块)

bash 复制代码
./configure [之前记录的所有参数] --add-module=/path/to/new_module

2.3 编译新版本

bash 复制代码
make  # 不要执行make install

2.4 备份旧二进制文件

bash 复制代码
cp /usr/sbin/nginx /usr/sbin/nginx.old

2.5 替换新二进制文件

bash 复制代码
cp objs/nginx /usr/sbin/nginx

3. 热重启关键操作

3.1 向主进程发送USR2信号

bash 复制代码
kill -USR2 `cat /var/run/nginx.pid`

这会启动新的Nginx主进程和工作进程,新旧进程会并行运行。

3.2 向旧主进程发送WINCH信号

bash 复制代码
kill -WINCH `cat /var/run/nginx.pid.oldbin`

这会优雅关闭旧的工作进程,保留主进程以防回滚。

3.3 验证新进程

bash 复制代码
ps -ef | grep nginx

确认新进程正常运行且服务正常。

4. 最终确认或回滚

4.1 如果确认新版本正常

bash 复制代码
kill -QUIT `cat /var/run/nginx.pid.oldbin`

彻底关闭旧的主进程。

4.2 如果需要回滚

bash 复制代码
kill -HUP `cat /var/run/nginx.pid.oldbin`  # 重启旧工作进程
kill -QUIT `cat /var/run/nginx.pid`       # 关闭新主进程

5. 自动化脚本示例

bash 复制代码
#!/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`"

注意事项

  1. 版本兼容性:确保新旧版本之间的配置兼容
  2. 模块兼容性:新增模块必须与当前Nginx版本兼容
  3. 长连接处理 :配置中应有 worker_shutdown_timeout 参数
  4. 日志分割:USR2信号也会重新打开日志文件,确保日志权限正确
  5. 监控:操作后密切监控服务器状态和错误日志

验证方法

bash 复制代码
# 检查版本
nginx -v

# 检查进程
ps -ef | grep nginx

# 检查错误日志
tail -f /var/log/nginx/error.log

这种热重启方式可以在不中断服务的情况下完成Nginx的升级或模块添加,特别适合生产环境使用。

相关推荐
谷歌开发者18 小时前
Web 开发指向标 | Chrome 开发者工具学习资源 (六)
前端·chrome·学习
发现你走远了19 小时前
连接模拟器网页进行h5的调试(使用Chrome远程调试(推荐)) 保姆级图文
前端·chrome
dkgee1 天前
如何禁止Chrome的重新启动即可更新窗口弹窗提示
前端·chrome
香香爱编程1 天前
electron对于图片/视频无法加载的问题
前端·javascript·vue.js·chrome·vscode·electron·npm
森语林溪1 天前
大数据环境搭建从零开始(十四)CentOS 7 系统更新源更换详解:阿里云镜像源配置完整指南
大数据·linux·运维·阿里云·centos
徒 花1 天前
Nginx
运维·nginx·云原生
csdn_aspnet1 天前
如何在 Mac、Ubuntu、CentOS、Windows 上安装 MySQL 客户端
linux·windows·mysql·macos·centos
guygg881 天前
Rocky Linux 8.9配置Kubernetes集群详解,适用于CentOS环境
linux·kubernetes·centos
csdn_aspnet1 天前
CentOS 7 上安装 MySQL 8.0
linux·mysql·centos