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的升级或模块添加,特别适合生产环境使用。

相关推荐
异彩13 小时前
一个纯前端的 Chrome 插件:不搭代理,也能把接口返回编圆
前端·chrome·mockito
健康活着就好15 小时前
# Nginx负载均衡四种策略,从原理到配置
nginx
lovingsoft15 小时前
Chrome Lighthouse 详解
前端·chrome
虎头金猫15 小时前
从上传PPT到观众远程打开互动页面:Claper在CentOS 7上的Docker部署、互动组件设置与固定访问地址实战
linux·运维·网络·人工智能·docker·centos·powerpoint
Vitaliy Kostrov(柯维远)16 小时前
谁来承担额外工作?CDN 参与者如何协商资源
nginx·缓存·系统架构·开源·cdn
北城笑笑17 小时前
Server 18 ,Nginx 双服务器 HTTP转HTTPS 代理实战( HTTP 地址换 HTTPS 域名 )
运维·服务器·前端·后端·nginx·http·https
Zenova EdgeOS18 小时前
Linux Nginx 反向代理实战:工业边缘 API 接入与安全加固
linux·nginx·安全·边缘计算·工业网关
Ikalus198819 小时前
我给自己写的工具,连着骗了我七次
chrome·浏览器
sun_weitao19 小时前
Chrome 扩展插件开发指南
前端·javascript·chrome