温馨提示×

如何在Debian上实现Tomcat的自动化部署

小樊
62
2026-01-11 08:26:49
栏目: 智能运维

在 Debian 上实现 Tomcat 自动化部署

一、方案总览

  • 采用systemd托管 Tomcat,保证开机自启与可编排启停。
  • 使用官方二进制包APT 包两种安装方式,均可脚本化。
  • 通过systemd 服务模板 + 实例目录实现多实例一键扩容。
  • 使用Nginx反向代理与负载均衡,便于横向扩展与静态资源处理。
  • 使用Ansible编排安装、部署与扩容,实现全流程自动化。

二、单机自动化部署脚本

  • 目标:安装 OpenJDK、部署 Tomcat 9、创建 tomcat 用户、配置 systemd、开放防火墙、可选安装管理器与 SSL。
  • 使用方法:保存为 install_tomcat.sh,执行:chmod +x install_tomcat.sh && sudo ./install_tomcat.sh
#!/usr/bin/env bash
set -Eeuo pipefail

# 可调参数
TOMCAT_MAJOR="9"
TOMCAT_VER="9.0.85"
INSTALL_DIR="/opt"
TOMCAT_USER="tomcat"
TOMCAT_GROUP="tomcat"
JAVA_PKG="openjdk-11-jdk"
TOMCAT_URL="https://archive.apache.org/dist/tomcat/tomcat-${TOMCAT_MAJOR}/v${TOMCAT_VER}/bin/apache-tomcat-${TOMCAT_VER}.tar.gz"

# 0) 环境准备
export DEBIAN_FRONTEND=noninteractive
apt-get update -y
apt-get install -y --no-install-recommends wget ca-certificates "$JAVA_PKG"

# 1) 创建系统用户
if ! id "$TOMCAT_USER" &>/dev/null; then
  groupadd --system "$TOMCAT_GROUP"
  useradd --system --shell /usr/sbin/nologin --home-dir "$INSTALL_DIR/tomcat" \
          --gid "$TOMCAT_GROUP" --comment "Apache Tomcat" "$TOMCAT_USER"
fi

# 2) 安装 Tomcat
mkdir -p "$INSTALL_DIR"
cd /tmp
wget -q --show-progress "$TOMCAT_URL" -O "apache-tomcat-${TOMCAT_VER}.tar.gz"
tar -xzf "apache-tomcat-${TOMCAT_VER}.tar.gz"
rm -rf "$INSTALL_DIR/tomcat"
mv "apache-tomcat-${TOMCAT_VER}" "$INSTALL_DIR/tomcat"
chown -R "$TOMCAT_USER:$TOMCAT_GROUP" "$INSTALL_DIR/tomcat"
chmod +x "$INSTALL_DIR/tomcat/bin/"*.sh

# 3) systemd 服务
cat >/etc/systemd/system/tomcat.service <<'EOF'
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_BASE=/opt/tomcat"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now tomcat

# 4) 防火墙
if command -v ufw &>/dev/null; then
  ufw allow 8080/tcp
elif command -v firewall-cmd &>/dev/null; then
  firewall-cmd --permanent --add-port=8080/tcp
  firewall-cmd --reload
fi

echo "Tomcat ${TOMCAT_VER} 已安装并启动,访问 http://$(hostname -I | awk '{print $1}'):8080"
  • 可选:安装管理器与脚本化部署
    • 安装组件:sudo apt-get install -y tomcat9-admin
    • 配置用户(/opt/tomcat/conf/tomcat-users.xml):
      • 角色:manager-gui、manager-script
      • 用户示例:
    • 放宽管理访问(仅示例,生产请限制网段):编辑
      • /usr/share/tomcat9-admin/manager/META-INF/context.xml
      • /usr/share/tomcat9-admin/host-manager/META-INF/context.xml
      • 将 RemoteAddrValve 的 allow 调整为需要的网段,或注释以放开(不建议对公网放开)。
    • 远程部署示例(Maven):
      • 在 settings.xml 配置 server:tomcat-deploydeployerChangeMe123!
      • 使用 tomcat7-maven-plugin 或 cargo-maven2-plugin 执行 tomcat:deploy。

三、多实例与横向扩容

  • 实例目录模板化
    • 复制模板:sudo cp -a /opt/tomcat /opt/tomcat2
    • 修改端口(/opt/tomcat2/conf/server.xml):
      • Server port:8005 → 8006
      • HTTP Connector:8080 → 8081
      • AJP:8009 → 8010
      • 若启用 HTTPS:8443 可保持或改为 8444
  • systemd 模板服务(/etc/systemd/system/tomcat@.service)
[Unit]
Description=Apache Tomcat %i
After=network.target

[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64"
Environment="CATALINA_PID=/opt/tomcat%i/temp/tomcat.pid"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_BASE=/opt/tomcat%i"
ExecStart=/opt/tomcat%i/bin/startup.sh
ExecStop=/opt/tomcat%i/bin/shutdown.sh
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
  • 常用操作
    • 启动实例:sudo systemctl start tomcat@2
    • 开机启用:sudo systemctl enable tomcat@2
  • Nginx 负载均衡示例(/etc/nginx/sites-available/tomcat)
upstream tomcat_cluster {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}
server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://tomcat_cluster;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
  • 重载:sudo ln -s /etc/nginx/sites-available/tomcat /etc/nginx/sites-enabled/ && sudo nginx -t && sudo systemctl reload nginx。

四、使用 Ansible 编排

  • 目录结构
    • roles/tomcat/
      • tasks/main.yml
      • templates/tomcat.service.j2
      • vars/main.yml
  • 示例任务(roles/tomcat/tasks/main.yml)
- name: Install OpenJDK
  apt:
    name: openjdk-11-jdk
    state: present
    update_cache: yes

- name: Create tomcat user
  user:
    name: tomcat
    group: tomcat
    system: yes
    shell: /usr/sbin/nologin
    home: /opt/tomcat

- name: Download and extract Tomcat
  unarchive:
    src: https://archive.apache.org/dist/tomcat/{{ tomcat_major }}/v{{ tomcat_version }}/bin/apache-tomcat-{{ tomcat_version }}.tar.gz
    dest: /opt
    remote_src: yes
    owner: tomcat
    group: tomcat

- name: Template systemd service
  template:
    src: tomcat.service.j2
    dest: /etc/systemd/system/tomcat.service
  notify: reload systemd

- name: Enable and start Tomcat
  systemd:
    name: tomcat
    enabled: yes
    state: started

- name: Open port 8080
  ufw:
    rule: allow
    port: '8080'
    proto: tcp
  • 模板示例(templates/tomcat.service.j2)
[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_BASE=/opt/tomcat"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
  • 运行:ansible-playbook -i inventory site.yml。

五、验证与常见问题

  • 验证
    • 进程与端口:sudo systemctl status tomcat;ss -lntp | grep ‘:8080|:8005|:8009’
    • 访问测试:http://服务器IP:8080 出现 Tomcat 欢迎页
    • 日志:tail -f /opt/tomcat/logs/catalina.out
  • 常见问题
    • 权限错误:确保 /opt/tomcat 归属 tomcat:tomcat,/opt/tomcat/bin/*.sh 可执行。
    • 端口冲突:多实例需修改 8005/8080/8009/8443 等端口。
    • 启动缓慢:在 setenv.sh 或 JAVA_OPTS 中加入 -Djava.security.egd=file:/dev/./urandom
    • 远程部署被拒:确认 manager-script 角色与 IP 白名单配置正确。

0