在 Debian 上实现 Tomcat 自动化部署
一、方案总览
二、单机自动化部署脚本
#!/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"
三、多实例与横向扩容
[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
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;
}
}
四、使用 Ansible 编排
- 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
[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
五、验证与常见问题