博客 / 詳情

返回

藍易雲cdn:tomcat版本自動升級腳本

藍易雲 CDN:Tomcat 版本自動升級腳本方案 🚀

在高併發場景下,應用節點一旦 Tomcat 版本老舊,既容易踩到各種 <span style="color:red">安全漏洞</span>,又難以及時享受到性能優化。當前 Tomcat 9 / 10 / 11 分支仍在持續維護,其中 11.0.x 已作為穩定分支發佈,同時 2025 年披露的多枚 Tomcat 漏洞幾乎覆蓋所有主流版本,如果不做統一版本管控,很容易出現“集羣裏一半修好、一半還在裸奔”的狀況。(Apache Tomcat)

下面給出一套面向藍易雲 CDN 應用節點的 <span style="color:red">Tomcat 版本自動升級腳本</span> 設計思路與示例實現,重點強調:安全可回滾、過程可觀測、升級可標準化。


一、腳本設計核心思路(針對集羣場景)

  1. <span style="color:red">統一入口</span>:所有節點使用同一升級腳本,只通過變量區分不同環境(測試 / 生產)。
  2. <span style="color:red">版本集中控制</span>:通過內部“版本號接口”統一下發目標版本,避免每台機器各自去外網抓版本。
  3. <span style="color:red">先備份再升級</span>:升級前完整打包當前 Tomcat 目錄,出問題隨時回滾。
  4. <span style="color:red">軟鏈接切換</span>:/opt/tomcat/current 指向當前運行版本,新版本準備好後只需切一次鏈接。
  5. <span style="color:red">與 systemd 集成</span>:規範使用 systemctl stop/start,避免“野路子”腳本啓動。

二、Tomcat 版本自動升級腳本(示例)

説明:示例以 /opt/tomcat/current 為當前運行目錄,目標版本號由內部接口返回;實際使用時請替換內部接口地址與下載方式。
#!/bin/bash
# BlueEasy · Tomcat Auto Upgrader
# 適用:藍易雲 CDN 應用節點 Tomcat 自動升級

set -euo pipefail

TOMCAT_BASE="/opt/tomcat"
TOMCAT_SYMLINK="$TOMCAT_BASE/current"
BACKUP_DIR="$TOMCAT_BASE/backup"
TOMCAT_SERVICE="tomcat"                    # systemd 服務名
VERSION_API="請填寫內部版本接口地址"        # 例如內部 HTTP 接口,返回 11.0.6 這樣的版本號

mkdir -p "$BACKUP_DIR"

# 1)讀取當前運行版本
CURRENT_VERSION=$("$TOMCAT_SYMLINK/bin/catalina.sh" version 2>/dev/null \
    | awk -F'/' '/Server version/ {print $2}' | awk '{print $1}')

# 2)從內部接口獲取最新版本號
LATEST_VERSION=$(curl -fsSL "$VERSION_API" | tr -d ' \n')

if [[ -z "${LATEST_VERSION:-}" ]]; then
  echo "獲取最新版本號失敗,請檢查 VERSION_API"
  exit 1
fi

if [[ "$CURRENT_VERSION" == "$LATEST_VERSION" ]]; then
  echo "Tomcat 已是最新版本:$CURRENT_VERSION"
  exit 0
fi

echo "當前版本:$CURRENT_VERSION,將升級到:$LATEST_VERSION"

# 3)停止服務並備份舊版本
echo "停止 Tomcat 服務..."
systemctl stop "$TOMCAT_SERVICE"

BACKUP_FILE="$BACKUP_DIR/tomcat-$CURRENT_VERSION-$(date +%F-%H%M%S).tar.gz"
echo "備份當前版本到:$BACKUP_FILE"
tar czf "$BACKUP_FILE" "$TOMCAT_SYMLINK"

# 4)解壓新版本(假設壓縮包已由其他任務下載到 /opt/src)
NEW_DIR="$TOMCAT_BASE/apache-tomcat-$LATEST_VERSION"
SRC_TAR="/opt/src/apache-tomcat-$LATEST_VERSION.tar.gz"

if [[ ! -f "$SRC_TAR" ]]; then
  echo "未找到新版本安裝包:$SRC_TAR,請先下載後再執行本腳本"
  exit 1
fi

echo "解壓新版本到:$NEW_DIR"
rm -rf "$NEW_DIR"
tar xzf "$SRC_TAR" -C "$TOMCAT_BASE"

# 5)遷移配置與應用
echo "同步配置與應用..."
rsync -a --delete "$TOMCAT_SYMLINK/conf/"   "$NEW_DIR/conf/"
rsync -a          "$TOMCAT_SYMLINK/webapps/" "$NEW_DIR/webapps/"

# 6)切換軟鏈接並啓動
echo "切換運行目錄軟鏈接..."
ln -sfn "$NEW_DIR" "$TOMCAT_SYMLINK"

echo "啓動 Tomcat 服務..."
systemctl start "$TOMCAT_SERVICE"

echo "✅ 升級完成:$CURRENT_VERSION -> $LATEST_VERSION"

三、腳本關鍵步驟詳解(逐段解釋)

  1. 安全開關與基礎變量

    • set -euo pipefail

      • -e:任何命令返回非 0 立即退出,避免半升級狀態;
      • -u:訪問未定義變量時直接報錯,防止拼錯環境變量;
      • -o pipefail:管道中任一命令失敗都會傳遞錯誤碼,避免錯誤被忽略。
    • TOMCAT_BASE / TOMCAT_SYMLINK / BACKUP_DIR:統一約定安裝根目錄、當前運行軟鏈接和備份目錄,便於批量運維。
    • VERSION_API:內部版本號接口,由藍易雲統一維護,可根據發佈節奏控制節點升級到 <span style="color:red">指定版本</span>。
  2. 當前版本與目標版本獲取邏輯

    • catalina.sh version:Tomcat 官方提供的版本輸出方式,輸出包含 Apache Tomcat/9.0.112 類似內容;後面的 awk 組合只保留版本號部分,避免解析錯誤。
    • curl -fsSL "$VERSION_API":從內部接口拉取目標版本號,通常建議接口只返回純文本數字(如 11.0.6),後續用 tr -d ' \n' 去掉空格與換行,減少格式問題。
    • if [[ -z "${LATEST_VERSION:-}" ]]:防禦性判斷,防止接口異常時繼續升級。
  3. 版本一致性判斷與快速退出

    • if [[ "$CURRENT_VERSION" == "$LATEST_VERSION" ]]
      當版本一致時直接退出,這讓腳本可以被 cron 定時觸發,而不會對業務造成無意義的重啓。
  4. 停止服務與安全備份

    • systemctl stop "$TOMCAT_SERVICE":通過 systemd 標準方式停止服務,便於日誌、依賴和限制統一管理。
    • tar czf "$BACKUP_FILE" "$TOMCAT_SYMLINK"

      • 使用 tar + gz 對當前運行目錄做完整打包;
      • 備份文件名包含舊版本號與時間戳,便於快速定位、回滾。
    • 一旦升級失敗,只需:

      systemctl stop tomcat
      rm -rf /opt/tomcat/current
      tar xzf 備份文件 -C /opt/tomcat
      ln -sfn 解壓目錄 /opt/tomcat/current
      systemctl start tomcat

      即可恢復到升級前狀態。

  5. 新版本解壓與配置遷移

    • SRC_TAR="/opt/src/apache-tomcat-$LATEST_VERSION.tar.gz":將“下載新包”的職責拆給上游任務(例如 CI/CD、運維平台),升級腳本只負責解壓與切換,職責邊界更清晰。
    • rm -rf "$NEW_DIR" + tar xzf ...:確保目標目錄是乾淨的,避免舊文件殘留影響排查。
    • rsync -a --delete "$TOMCAT_SYMLINK/conf/" "$NEW_DIR/conf/"

      • -a 保留權限、時間戳等元數據;
      • --delete 確保新目錄中多餘的配置文件被清理,配置結構與舊版本保持一致。
    • rsync -a "$TOMCAT_SYMLINK/webapps/" "$NEW_DIR/webapps/":遷移業務應用,避免升級後出現空目錄。
  6. 軟鏈接切換與服務啓動

    • ln -sfn "$NEW_DIR" "$TOMCAT_SYMLINK"

      • -s 創建軟鏈接;
      • -f 強制覆蓋已有鏈接;
      • -n 避免把已有目錄當作子目錄處理。
        通過軟鏈接切換,可以做到 <span style="color:red">“一鍵回滾”</span>。
    • systemctl start "$TOMCAT_SERVICE":啓動服務後,正式使用新版本 Tomcat。

四、自動升級工作流程圖(vditor 可用)

graph TD
  A[定時任務 / 人工觸發] --> B[讀取當前 Tomcat 版本]
  B --> C[調用內部接口獲取最新版本號]
  C --> D{是否有新版本?}
  D -- 否 --> G[記錄日誌後退出]
  D -- 是 --> E[停止服務並打包備份]
  E --> F[解壓新版本並遷移 conf/webapps]
  F --> H[切換 current 軟鏈接]
  H --> I[啓動 Tomcat 並拉起健康檢查]
  I --> J[記錄升級結果 & 告警]

五、關鍵步驟分析説明表 📊

步驟 作用説明 實踐要點
<span style="color:red">版本檢測</span> 判斷是否需要升級,避免無意義重啓 建議同時在升級平台側做版本可視化,便於排查異常節點
<span style="color:red">內部版本接口</span> 統一控制各環境目標版本,避免節點各自“亂升” 推薦由發佈系統寫入最新穩定版本號,再由腳本定時拉取
<span style="color:red">全量備份</span> 保障可回滾,是生產環境敢用自動升級腳本的前提 至少包含 conf、webapps、bin 等關鍵目錄
<span style="color:red">軟鏈接切換</span> 快速切換運行版本,且回滾只需改回鏈接 目錄命名中包含版本號,運維層面一眼能看出當前運行版本
<span style="color:red">systemd 集成</span> 與系統服務管理統一,便於日誌、資源限制、依賴控制 建議配合 Restart=on-failure、限制最大打開文件數等

整體來看,上述腳本只是一個“骨架”,真正落地到藍易雲 CDN,還可以疊加:灰度升級(先邊緣節點、再核心節點)、升級前後自動壓測、升級失敗自動回滾等能力。但只要把 <span style="color:red">版本檢測 → 備份 → 解壓 → 配置遷移 → 軟鏈切換 → 重啓</span> 這條主鏈打通,就已經邁出了比較紮實的一步 ✅。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.