温馨提示×

Debian JSP应用如何实现自动化部署

小樊
43
2025-12-14 17:59:46
栏目: 编程语言

Debian 上实现 JSP 应用自动化部署

一、方案总览

  • 构建与打包:在 CI 中用 Maven/Gradle 执行 mvn clean packagegradle build,产出 WAR 包。
  • 制品存储:将 WAR 上传到制品仓库(如 Nexus/Artifactory)或 CI 工件区。
  • 目标环境准备:在 Debian 上安装 OpenJDK 11Tomcat 9(可用系统包或二进制安装),并配置为 systemd 服务,便于启停与回滚。
  • 自动化发布:使用 AnsibleShell 脚本完成 WAR 分发、备份、部署、健康检查与回滚;配合 Jenkins/GitLab CI 实现一键触发与流水线编排。

二、环境与前置准备

  • 安装 Java 与 Tomcat
    • OpenJDK 11:sudo apt update && sudo apt install -y openjdk-11-jdk
    • Tomcat 9(系统包):sudo apt install -y tomcat9(便于用 systemd 管理)
    • 或二进制安装 Tomcat 9(便于多实例/自定义路径):下载解压至 /opt/apache-tomcat-9.0.x,创建 tomcat 用户并配置 /etc/systemd/system/tomcat.service(设置 JAVA_HOME、CATALINA_HOME、CATALINA_BASE、JAVA_OPTS/CATALINA_OPTS 等),然后 systemctl daemon-reload && systemctl enable --now tomcat。
  • 防火墙放行:sudo ufw allow 8080/tcp(如启用 HTTPS 则放行 8443/tcp)。
  • 目录约定:系统包默认应用目录 /var/lib/tomcat9/webapps;二进制安装常用 /opt/tomcat/webapps

三、自动化部署脚本示例

  • 目标:零停机(热部署)、失败回滚、简单健康检查;支持系统包与二进制两种 Tomcat 路径。
  • 前置:在 CI 构建完成后,产物为 target/app.war;目标主机可通过 SSH 免密登录;Tomcat 运行用户为 tomcat

示例脚本 deploy.sh(可放入 Ansible 或 Jenkins 步骤中执行)

#!/usr/bin/env bash
set -Eeuo pipefail

APP_NAME="${1:-myapp}"
WAR_SRC="${2:-target/app.war}"
TOMCAT_WEBAPPS="${3:-/var/lib/tomcat9/webapps}"   # 二进制安装可改为 /opt/tomcat/webapps
TOMCAT_USER="${4:-tomcat}"
TOMCAT_GROUP="${5:-tomcat}"
HEALTH_URL="http://localhost:8080/${APP_NAME}/health"
TIMEOUT=60
SLEEP_INTERVAL=5

# 0) 参数与前置校验
[[ -f "$WAR_SRC" ]] || { echo "WAR not found: $WAR_SRC"; exit 1; }
command -v curl >/dev/null 2>&1 || { echo "curl required"; exit 1; }

# 1) 备份当前版本
APP_DIR="$TOMCAT_WEBAPPS/$APP_NAME"
BAK_DIR="$TOMCAT_WEBAPPS/${APP_NAME}_bak_$(date +%F-%H%M%S)"
if [[ -d "$APP_DIR" ]]; then
  echo "Backing up $APP_DIR -> $BAK_DIR"
  sudo cp -a "$APP_DIR" "$BAK_DIR"
fi

# 2) 部署新版本(原子替换)
TMP_DEPLOY="$TOMCAT_WEBAPPS/${APP_NAME}.new"
sudo rm -rf "$TMP_DEPLOY"
sudo cp "$WAR_SRC" "$TMP_DEPLOY"
sudo chown "$TOMCAT_USER:$TOMCAT_GROUP" "$TMP_DEPLOY"

# 3) 触发部署(热部署:复制即部署;如需重启可取消下一行注释)
# sudo systemctl restart tomcat

# 4) 健康检查与回滚
echo "Waiting for $HEALTH_URL (timeout=${TIMEOUT}s)..."
for ((i=0; i<TIMEOUT; i+=SLEEP_INTERVAL)); do
  if curl -sf --max-time 5 "$HEALTH_URL" >/dev/null; then
    echo "Health check OK"
    # 部署成功:清理旧备份(保留最近2个)
    (ls -1t "$TOMCAT_WEBAPPS/${APP_NAME}_bak_"* 2>/dev/null | tail -n +3 | xargs -r sudo rm -rf) || true
    exit 0
  fi
  sleep "$SLEEP_INTERVAL"
done

# 5) 失败回滚
echo "Health check FAILED, rolling back..."
sudo rm -rf "$APP_DIR"
if [[ -d "$BAK_DIR" ]]; then
  sudo mv "$BAK_DIR" "$APP_DIR"
  # 如需重启可取消下一行注释
  # sudo systemctl restart tomcat
fi
exit 1
  • 使用方式
    • 本地/CI 直接执行:./deploy.sh myapp target/app.war /var/lib/tomcat9/webapps tomcat tomcat
    • 二进制 Tomcat:将第三个参数改为 /opt/tomcat/webapps
    • 如需蓝绿/金丝雀,可先部署到 /var/lib/tomcat9/webapps/app-green,再通过反向代理(如 Nginx)切换流量,再下线旧版本。

四、CI 流水线示例

  • Jenkinsfile(片段)
pipeline {
  agent any
  tools { jdk 'openjdk-11' }
  stages {
    stage('Build') {
      steps {
        sh 'mvn -B -DskipTests clean package'
      }
    }
    stage('Deploy to Staging') {
      steps {
        withCredentials([sshUserPrivateKey(credentialsId: 'deploy-key', keyFileVariable: 'SSH_KEY')]) {
          sh '''
            scp -i "$SSH_KEY" -o StrictHostKeyChecking=no target/app.war debian@staging.example.com:/tmp/app.war
            ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no debian@staging.example.com \
              "sudo /opt/scripts/deploy.sh myapp /tmp/app.war /var/lib/tomcat9/webapps tomcat tomcat"
          '''
        }
      }
    }
    stage('Smoke Test') {
      steps {
        sh 'curl -sf http://staging.example.com/myapp/health | grep -q OK'
      }
    }
    stage('Deploy to Production') {
      when { branch 'main' }
      steps { ... } // 同上,目标主机为生产
    }
  }
}
  • 说明
    • 构建阶段使用 Maven 生成 WAR;部署阶段通过 SCP/SSH 调用上一节的脚本完成分发、健康检查与回滚;可按需接入审批、灰度与通知。

五、运维与安全要点

  • 日志与排错:Tomcat 日志位于 /var/log/tomcat9/,常用 tail -f /var/log/tomcat9/catalina.out 实时查看;部署失败优先检查该日志与应用的 health 接口。
  • 进程与资源:在 systemd 服务中设置 JAVA_OPTS/CATALINA_OPTS(如 -Xms512M -Xmx1024M)、Restart=always,提升稳定性与自恢复能力。
  • 安全加固:
    • 仅暴露必要端口(如 8080/8443),使用 ufw 或云安全组限制来源;
    • 启用 HTTPS/TLS:在 /etc/tomcat9/server.xml 配置 8443 连接器,证书可用 Let’s Encrypt 获取并指向 fullchain.pemprivkey.pem
    • 运行 Tomcat 使用最小权限的系统用户(如 tomcat),目录权限最小化;管理界面(如 /manager/html)应启用强认证与 IP 白名单。

0