插件窝 干货文章 nginx编译安装后怎么对nginx进行平滑升级

nginx编译安装后怎么对nginx进行平滑升级

Nginx local 升级 版本 583    来源:    2025-04-26

Nginx平滑升级指南

平滑升级是指在不停机的情况下更新Nginx服务,确保服务持续可用。以下是详细的平滑升级步骤:

准备工作

  1. 备份当前配置和二进制文件

    cp -r /usr/local/nginx/conf /path/to/backup/nginx_conf_backup
    cp /usr/local/nginx/sbin/nginx /path/to/backup/nginx_old_version
    
  2. 下载新版本Nginx源码包

    wget http://nginx.org/download/nginx-x.x.x.tar.gz
    tar zxvf nginx-x.x.x.tar.gz
    cd nginx-x.x.x
    

编译新版本

  1. 配置编译参数(使用与旧版本相同的参数):

    ./configure --prefix=/usr/local/nginx [其他原有参数]
    

    可以使用nginx -V查看旧版本的编译参数

  2. 编译新版本(不安装):

    make
    

执行平滑升级

  1. 替换二进制文件

    cp objs/nginx /usr/local/nginx/sbin/nginx
    
  2. 测试新版本

    /usr/local/nginx/sbin/nginx -t
    
  3. 发送USR2信号给主进程

    kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
    

    这会启动新的主进程和工作进程,同时旧的工作进程继续处理现有连接

  4. 发送WINCH信号给旧主进程

    kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`
    

    这会优雅地关闭旧的工作进程

  5. 验证升级

    • 检查日志:tail -f /usr/local/nginx/logs/error.log
    • 检查版本:/usr/local/nginx/sbin/nginx -v

升级后处理

  1. 如果升级成功,可以关闭旧的主进程:

    kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
    
  2. 如果升级失败,可以回滚:

    kill -HUP `cat /usr/local/nginx/logs/nginx.pid.oldbin`  # 重启旧工作进程
    kill -QUIT `cat /usr/local/nginx/logs/nginx.pid`        # 关闭新主进程
    

注意事项

  1. 确保新旧版本的配置文件兼容
  2. 如果使用了第三方模块,需要在新版本中重新编译这些模块
  3. 平滑升级期间,Nginx会保持运行,但某些新功能可能需要reload才能完全生效
  4. 建议在低峰期进行升级操作

自动化脚本示例

#!/bin/bash
# Nginx平滑升级脚本

OLD_NGINX=/usr/local/nginx/sbin/nginx
BACKUP_DIR=/opt/nginx_backup/`date +%Y%m%d`

# 创建备份目录
mkdir -p $BACKUP_DIR

# 备份旧版本
cp $OLD_NGINX $BACKUP_DIR/nginx_old
cp -r /usr/local/nginx/conf $BACKUP_DIR/conf

# 编译新版本
cd /opt/nginx-x.x.x
./configure --prefix=/usr/local/nginx [其他参数]
make

# 替换二进制
cp objs/nginx $OLD_NGINX

# 测试配置
$OLD_NGINX -t || exit 1

# 平滑升级
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
sleep 5
kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`

echo "升级完成,请验证服务是否正常"

通过以上步骤,您可以实现Nginx的无缝升级,确保服务不中断。