Nginx 平滑升级脚本
8

  1. 下载并解压指定版本的 Nginx;

  2. 编译新版本

  3. 平滑替换并升级

  4. 自动回滚如果新进程启动失败。

# 安装依赖
yum install -y gcc make pcre pcre-devel zlib zlib-devel openssl openssl-devel wget
# 或者
apt install -y gcc make libpcre3 libpcre3-dev zlib1g-dev libssl-dev wget

#!/bin/bash

set -e

# === 配置项 ===
NGINX_PREFIX="/usr/local/nginx"
NGINX_SBIN="$NGINX_PREFIX/sbin/nginx"
NGINX_CONF="$NGINX_PREFIX/conf/nginx.conf"
NGINX_VERSION="1.26.0"
NGINX_TARBALL="nginx-$NGINX_VERSION.tar.gz"
NGINX_SRC_DIR="/usr/local/src/nginx-$NGINX_VERSION"
NGINX_DOWNLOAD_URL="http://nginx.org/download/$NGINX_TARBALL"
BACKUP_DIR="/usr/local/nginx_backup_$(date +%Y%m%d%H%M)"
BUILD_DIR="/usr/local/src"

# === Step 0: 环境检查 ===
command -v wget >/dev/null || { echo "请先安装 wget"; exit 1; }
command -v gcc >/dev/null || { echo "请先安装 gcc"; exit 1; }
command -v make >/dev/null || { echo "请先安装 make"; exit 1; }

echo "=== Step 1: 检查当前 Nginx 版本 ==="
$NGINX_SBIN -v || exit 1

echo "=== Step 2: 备份原 nginx 二进制 ==="
mkdir -p "$BACKUP_DIR"
cp "$NGINX_SBIN" "$BACKUP_DIR/nginx.old"

echo "=== Step 3: 下载新版本 Nginx ==="
cd "$BUILD_DIR"
if [ ! -f "$NGINX_TARBALL" ]; then
  wget "$NGINX_DOWNLOAD_URL"
fi

echo "=== Step 4: 解压源码 ==="
rm -rf "$NGINX_SRC_DIR"
tar -zxf "$NGINX_TARBALL"

echo "=== Step 5: 编译新 Nginx(不安装) ==="
cd "$NGINX_SRC_DIR"

# ⚠️ 根据你之前使用的模块参数自行调整
$NGINX_SBIN -V 2>&1 | grep -- '--' > config.args
./configure $(cat config.args) || exit 1
make || exit 1

echo "=== Step 6: 替换 nginx 可执行文件 ==="
cp -f "$NGINX_SBIN" "$NGINX_SBIN.old"
cp -f objs/nginx "$NGINX_SBIN"

echo "=== Step 7: 平滑启动新 Nginx 主进程 ==="
PIDFILE="$NGINX_PREFIX/logs/nginx.pid"
OLD_MASTER_PID=$(cat "$PIDFILE")
kill -USR2 "$OLD_MASTER_PID"

sleep 2

NEW_PIDFILE="$NGINX_PREFIX/logs/nginx.pid.newbin"
if [ ! -f "$NEW_PIDFILE" ]; then
  echo "❌ 新 master 启动失败,回滚旧版本..."
  cp -f "$NGINX_SBIN.old" "$NGINX_SBIN"
  kill -HUP "$OLD_MASTER_PID"
  exit 1
fi

echo "✅ 新 master 启动成功,关闭旧 worker..."
kill -WINCH "$OLD_MASTER_PID"
sleep 1

echo "=== Step 8: 关闭旧 master ==="
kill -QUIT "$OLD_MASTER_PID"
rm -f "$NEW_PIDFILE" "$NGINX_SBIN.old"

echo "✅ 升级完成,新版本如下:"
$NGINX_SBIN -v

Nginx 平滑升级脚本
http://localhost:8090/archives/wei-ming-ming-wen-zhang
作者
Haoyuan
发布于
更新于
许可