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

相关推荐
闲云一鹤21 小时前
nginx 快速入门教程 - 写给前端的你
前端·nginx·前端工程化
xy123061 天前
OpenStack Train 部署实战(三)控制节点--keystone服务
centos·openstack
简离4 天前
前端调试实战:基于 chrome://webrtc-internals/ 高效排查WebRTC问题
前端·chrome·webrtc
何中应4 天前
Nginx转发请求错误
前端·后端·nginx
欧云服务器5 天前
怎么让脚本命令可以同时在centos、debian、ubuntu执行?
ubuntu·centos·debian
芝士雪豹只抽瑞克五5 天前
Nginx 高性能Web服务器笔记
服务器·nginx
失重外太空啦5 天前
nginx
运维·nginx
天蓝不会忘记025 天前
lvs,haproxy,keepalived,nginx,tomcat介绍和实验
nginx·tomcat·lvs
xiaoliuliu123455 天前
CentOS 7 安装 gcc-4.8.5-44.el7.x86_64.rpm 详细步骤(含依赖解决)
linux·运维·centos