温馨提示×

如何利用Linux Tomcat实现自动化部署

小樊
48
2025-11-23 05:23:03
栏目: 智能运维

Linux Tomcat自动化部署实践

一、方案总览与适用场景

  • 下表给出三种常用路径,覆盖从本地打包到远程发布的完整链路,可按团队成熟度与网络策略选择或组合使用。
方式 核心思路 适用场景 关键要点
Shell脚本一键发布 本地/CI构建出 WAR → 通过 SCP/FTP 上传 → 脚本执行停服、备份、部署、启动、健康检查 内网隔离、多实例、需要自定义流程与回滚策略 原子化操作、备份与回滚、启动失败告警、日志追踪
Maven Tomcat 插件部署 pom.xml 配置 tomcat7-maven-plugin → 执行 mvn tomcat7:deploy/redeploy 开发-测试联动、快速迭代、与CI/CD天然集成 配置 manager 用户与权限、settings.xml 的 server 认证、使用 /manager/text 接口
Jenkins 流水线 Jenkins 拉代码 → 构建 → 调用脚本或 Maven 插件 → 多机分发与回滚 规范化交付、多环境发布、可审计可追溯 参数化构建、人工确认门禁、制品归档、回滚作业、并发控制

二、Shell脚本一键发布实战

  • 核心流程
    • 停服:调用 $CATALINA_HOME/bin/shutdown.sh,结合 ps 校验进程退出,必要时超时强杀。
    • 备份:将 webapps/应用目录 与当前 WAR 备份到时间戳目录,便于回滚。
    • 部署:清理旧包/旧目录,拷贝新 WAR;如需根应用,可部署为 ROOT.war
    • 启动:执行 startup.shnohup catalina.sh start,并 tail 日志观察启动是否成功。
    • 健康检查:轮询 /healthcatalina.out 关键字,超时判定失败并回滚。
  • 参考脚本骨架(可按需裁剪)
#!/usr/bin/env bash
set -Eeuo pipefail

export CATALINA_HOME="/opt/apache-tomcat-9.0.xx"
APP_NAME="myapp"
WAR_SRC="/opt/dist/${APP_NAME}.war"
WEBAPPS="$CATALINA_HOME/webapps"
BACKUP_DIR="/opt/backups/${APP_NAME}/$(date +%F_%H%M%S)"
HEALTH_URL="http://127.0.0.1:8080/${APP_NAME}/health"
TIMEOUT=60
SLEEP=5

log(){ echo "[$(date '+%F %T')] $*"; }

stop_tomcat(){
  log "Stopping Tomcat..."
  "$CATALINA_HOME/bin/shutdown.sh" || true
  local i=0
  while (( i < TIMEOUT )); do
    pid=$(ps -ef | grep "$CATALINA_HOME" | grep -v grep | awk '{print $2}' | head -n1)
    [[ -z "$pid" ]] && { log "Tomcat stopped."; return 0; }
    sleep "$SLEEP"; ((i+=SLEEP))
  done
  log "Timeout, killing Tomcat..."
  pkill -f "$CATALINA_HOME" || true
}

backup(){
  log "Backup $APP_NAME to $BACKUP_DIR"
  mkdir -p "$BACKUP_DIR"
  cp -a "$WEBAPPS/${APP_NAME}" "$BACKUP_DIR/" 2>/dev/null || true
  cp -a "$WAR_SRC" "$BACKUP_DIR/" 2>/dev/null || true
}

deploy(){
  log "Deploying $WAR_SRC to $WEBAPPS"
  rm -rf "$WEBAPPS/${APP_NAME}" "$WEBAPPS/${APP_NAME}.war"
  cp "$WAR_SRC" "$WEBAPPS/${APP_NAME}.war"
}

start_tomcat(){
  log "Starting Tomcat..."
  "$CATALINA_HOME/bin/startup.sh"
}

health_check(){
  log "Health check $HEALTH_URL"
  local i=0
  while (( i < TIMEOUT )); do
    if curl -sf "$HEALTH_URL" >/dev/null; then
      log "Health check OK."
      return 0
    fi
    sleep "$SLEEP"; ((i+=SLEEP))
  done
  log "Health check FAILED."
  return 1
}

rollback(){
  log "Rolling back..."
  pkill -f "$CATALINA_HOME" || true
  sleep 3
  rm -rf "$WEBAPPS/${APP_NAME}" "$WEBAPPS/${APP_NAME}.war"
  cp -a "$BACKUP_DIR/${APP_NAME}" "$WEBAPPS/" 2>/dev/null || true
  cp -a "$BACKUP_DIR/${APP_NAME}.war" "$WEBAPPS/" 2>/dev/null || true
  "$CATALINA_HOME/bin/startup.sh"
}

main(){
  trap rollback ERR
  stop_tomcat
  backup
  deploy
  start_tomcat
  if ! health_check; then
    rollback
    exit 1
  fi
  log "Deploy SUCCESS."
}

main "$@"
  • 使用要点
    • 建议以 非 root 运行,目录权限与 tomcat 用户一致。
    • 多实例场景需为 CATALINA_HOME/CATALINA_BASE 分别配置。
    • 若需并发安全,可在脚本外加 文件锁 或 CI 的 并发限制

三、Maven Tomcat 插件部署

  • 服务端配置:在 $CATALINA_HOME/conf/tomcat-users.xml 增加可脚本化访问的管理角色与用户
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="deployer" password="StrongPass!23" roles="manager-script,manager-jmx,manager-status"/>
  • 客户端配置:在 ~/.m2/settings.xml 配置认证 Server
<servers>
  <server>
    <id>tomcat-server</id>
    <username>deployer</username>
    <password>StrongPass!23</password>
  </server>
</servers>
  • 项目配置:在 pom.xml 使用插件(示例为 tomcat7-maven-plugin)
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.2</version>
      <configuration>
        <url>http://192.168.10.20:8080/manager/text</url>
        <server>tomcat-server</server>
        <path>/${project.artifactId}</path>
        <update>true</update>
        <charset>UTF-8</charset>
      </configuration>
    </plugin>
  </plugins>
</build>
  • 常用命令
    • 首次部署:mvn clean package tomcat7:deploy
    • 热更新:mvn tomcat7:redeploy
  • 常见问题
    • 403/401:检查 tomcat-users.xml 角色是否为 manager-script,以及 settings.xmlserver id 是否一致。
    • 连接失败:确认 manager/text 已启用、网络与防火墙策略允许访问、Tomcat 已启动。

四、Jenkins 流水线编排

  • 基本步骤
    • 源码拉取 → 选择 Maven 构建(产出 WAR)→ 归档制品 → 调用 Shell 脚本Maven 插件 发布到目标 Tomcat → 健康检查 → 成功归档与通知,失败回滚。
  • 关键实践
    • 参数化构建:选择 环境(dev/test/prod)版本号/构建号是否回滚
    • 人工确认:生产发布前设置 确认门禁(Approval)
    • 并发与锁:同一 Tomcat 实例 同一时间只允许一个发布作业。
    • 回滚作业:基于已归档的 WAR/备份 快速回滚,减少 MTTR。
    • 安全:凭据使用 Jenkins Credentials 管理,禁止明文;限制脚本执行权限。

五、安全与运维要点

  • 访问控制:仅开放必要端口(如 8080/8443),管理端 /manager 限制来源 IP,强口令与最小权限原则。
  • 权限最小化:部署脚本与 Tomcat 运行用户分离,避免以 root 部署。
  • 原子化与回滚:先备份再部署,失败自动回滚;优先使用 WAR 部署而非直接替换目录。
  • 日志与审计:保留 catalina.out 与部署日志,关键步骤加时间戳与操作者标记。
  • 健康检查:应用提供 /health/actuator/health 端点,发布后自动校验,超时即回滚。
  • 多实例与并行:为 CATALINA_BASE 隔离实例,发布前检查端口占用与数据库连接池状态。

0