以下是 Tomcat 自动化脚本安装方案,支持多个版本和安装方式:
📦 Tomcat 一键安装脚本
脚本功能:
-
✅ 支持 Tomcat 8/9/10 版本选择
-
✅ 自动安装 JDK 依赖
-
✅ 创建 systemd 服务管理
-
✅ 配置用户认证和安全设置
-
✅ 支持 SSL/TLS 配置
-
✅ 自动防火墙配置
🔧 完整安装脚本
bash
#!/bin/bash
# Tomcat 自动安装脚本
# 支持: CentOS/RHEL/Ubuntu/Debian/Amazon Linux
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 输出函数
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_debug() { echo -e "${BLUE}[DEBUG]${NC} $1"; }
# 变量配置
TOMCAT_VERSION="9"
TOMCAT_MAJOR_VERSION="9"
TOMCAT_FULL_VERSION="9.0.85"
INSTALL_DIR="/opt"
TOMCAT_USER="tomcat"
TOMCAT_GROUP="tomcat"
# 检测系统
detect_os() {
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$ID
VER=$VERSION_ID
else
OS=$(uname -s)
VER=$(uname -r)
fi
log_info "检测到操作系统: $OS $VER"
}
# 安装JDK
install_java() {
log_info "检查Java环境..."
if java -version &>/dev/null; then
log_info "Java 已安装: $(java -version 2>&1 | head -n1)"
return 0
fi
log_info "安装 OpenJDK 8..."
case $OS in
ubuntu|debian)
apt-get update
apt-get install -y openjdk-8-jdk
;;
centos|rhel|amzn|fedora)
if command -v dnf >/dev/null 2>&1; then
dnf install -y java-1.8.0-openjdk-devel
else
yum install -y java-1.8.0-openjdk-devel
fi
;;
esac
# 设置JAVA_HOME
JAVA_HOME=$(readlink -f /usr/bin/java | sed 's:/bin/java::')
echo "export JAVA_HOME=$JAVA_HOME" >> /etc/profile.d/tomcat.sh
source /etc/profile.d/tomcat.sh
log_info "Java 安装完成: $(java -version 2>&1 | head -n1)"
}
# 创建Tomcat用户
create_tomcat_user() {
log_info "创建Tomcat用户和组..."
if id "$TOMCAT_USER" &>/dev/null; then
log_info "用户 $TOMCAT_USER 已存在"
else
groupadd $TOMCAT_GROUP
useradd -s /bin/false -g $TOMCAT_GROUP -d $INSTALL_DIR/tomcat $TOMCAT_USER
fi
}
# 下载安装Tomcat
install_tomcat() {
log_info "安装 Tomcat $TOMCAT_FULL_VERSION..."
# 选择版本
case $TOMCAT_VERSION in
8)
TOMCAT_MAJOR_VERSION="8"
TOMCAT_FULL_VERSION="8.5.98"
;;
9)
TOMCAT_MAJOR_VERSION="9"
TOMCAT_FULL_VERSION="9.0.85"
;;
10)
TOMCAT_MAJOR_VERSION="10"
TOMCAT_FULL_VERSION="10.1.20"
;;
*)
log_error "不支持的Tomcat版本: $TOMCAT_VERSION"
exit 1
;;
esac
# 下载Tomcat
cd /tmp
TOMCAT_URL="https://archive.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR_VERSION/v$TOMCAT_FULL_VERSION/bin/apache-tomcat-$TOMCAT_FULL_VERSION.tar.gz"
log_info "下载 Tomcat $TOMCAT_FULL_VERSION..."
if command -v wget >/dev/null 2>&1; then
wget $TOMCAT_URL
else
curl -O $TOMCAT_URL
fi
# 停止现有Tomcat服务
if systemctl is-active --quiet tomcat; then
systemctl stop tomcat
fi
# 安装Tomcat
tar -xzf apache-tomcat-$TOMCAT_FULL_VERSION.tar.gz
mv apache-tomcat-$TOMCAT_FULL_VERSION $INSTALL_DIR/tomcat
ln -sf $INSTALL_DIR/tomcat $INSTALL_DIR/tomcat/latest
# 设置权限
chown -R $TOMCAT_USER:$TOMCAT_GROUP $INSTALL_DIR/tomcat
chmod +x $INSTALL_DIR/tomcat/bin/*.sh
# 清理
rm -f apache-tomcat-$TOMCAT_FULL_VERSION.tar.gz
}
# 配置Tomcat
configure_tomcat() {
log_info "配置Tomcat..."
local TOMCAT_HOME="$INSTALL_DIR/tomcat"
local TOMCAT_CONF="$TOMCAT_HOME/conf"
# 备份原始配置
cp $TOMCAT_CONF/server.xml $TOMCAT_CONF/server.xml.backup
cp $TOMCAT_CONF/tomcat-users.xml $TOMCAT_CONF/tomcat-users.xml.backup
# 配置server.xml - 优化连接器
sed -i 's|<Connector port="8080" protocol="HTTP/1.1"|<Connector port="8080" protocol="HTTP/1.1"\n maxThreads="200"\n minSpareThreads="10"\n maxConnections="10000"\n compression="on"\n compressionMinSize="1024"\n compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"|' $TOMCAT_CONF/server.xml
# 配置AJP连接器(可选)
sed -i 's|<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />|<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" secretRequired="false" />|' $TOMCAT_CONF/server.xml
# 创建Tomcat用户管理
cat > $TOMCAT_CONF/tomcat-users.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="admin" password="tomcat@admin123" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
</tomcat-users>
EOF
# 配置管理界面访问限制
if [ ! -f $TOMCAT_HOME/webapps/manager/META-INF/context.xml ]; then
mkdir -p $TOMCAT_HOME/webapps/manager/META-INF
fi
cat > $TOMCAT_HOME/webapps/manager/META-INF/context.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
</Context>
EOF
# 创建setenv.sh配置内存参数
cat > $TOMCAT_HOME/bin/setenv.sh << 'EOF'
#!/bin/bash
# Java 内存配置
export JAVA_OPTS="$JAVA_OPTS -Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m"
# GC 配置
#export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:+DisableExplicitGC"
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC "
# 编码配置
export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
# 时区配置
export JAVA_OPTS="$JAVA_OPTS -Duser.timezone=Asia/Shanghai"
# 安全配置
export JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
EOF
chmod +x $TOMCAT_HOME/bin/setenv.sh
chown $TOMCAT_USER:$TOMCAT_GROUP $TOMCAT_HOME/bin/setenv.sh
}
# 创建systemd服务
create_systemd_service() {
log_info "创建systemd服务..."
cat > /etc/systemd/system/tomcat.service << EOF
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
User=$TOMCAT_USER
Group=$TOMCAT_GROUP
Environment="JAVA_HOME=$JAVA_HOME"
Environment="CATALINA_PID=$INSTALL_DIR/tomcat/temp/tomcat.pid"
Environment="CATALINA_HOME=$INSTALL_DIR/tomcat"
Environment="CATALINA_BASE=$INSTALL_DIR/tomcat"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
ExecStart=$INSTALL_DIR/tomcat/bin/startup.sh
ExecStop=$INSTALL_DIR/tomcat/bin/shutdown.sh
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
}
# 配置防火墙
configure_firewall() {
log_info "配置防火墙..."
if command -v ufw >/dev/null 2>&1; then
ufw allow 8080/tcp
ufw reload
elif command -v firewall-cmd >/dev/null 2>&1; then
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
else
log_warn "未找到防火墙工具,请手动开放8080端口"
fi
}
# 配置SSL(可选)
configure_ssl() {
log_info "配置SSL/TLS..."
local TOMCAT_CONF="$INSTALL_DIR/tomcat/conf"
# 生成自签名证书(生产环境应使用正式证书)
if [ ! -f $TOMCAT_CONF/keystore.jks ]; then
keytool -genkey -alias tomcat -keyalg RSA -keysize 2048 \
-keystore $TOMCAT_CONF/keystore.jks \
-keypass changeit -storepass changeit \
-dname "CN=localhost, OU=IT, O=Company, L=City, ST=State, C=CN" \
-validity 3650
fi
chown $TOMCAT_USER:$TOMCAT_GROUP $TOMCAT_CONF/keystore.jks
# 配置SSL连接器
if ! grep -q "SSL HTTP/1.1 Connector" $TOMCAT_CONF/server.xml; then
sed -i '/<!-- Define an SSL HTTP\/1.1 Connector on port 8443 -->/,/<!--/ s/<!--//' $TOMCAT_CONF/server.xml
sed -i '/<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"/,/\/>/ s/<!--//' $TOMCAT_CONF/server.xml
fi
}
# 创建测试应用
create_test_app() {
log_info "创建测试应用..."
local WEBAPPS_DIR="$INSTALL_DIR/tomcat/webapps"
# 创建测试应用目录
mkdir -p $WEBAPPS_DIR/test/WEB-INF/classes
mkdir -p $WEBAPPS_DIR/test/WEB-INF/lib
# 创建web.xml
cat > $WEBAPPS_DIR/test/WEB-INF/web.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>Tomcat Test Application</display-name>
<description>
Test application for Tomcat installation
</description>
</web-app>
EOF
# 创建测试页面
cat > $WEBAPPS_DIR/test/index.jsp << 'EOF'
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="java.util.*, java.text.*" %>
<!DOCTYPE html>
<html>
<head>
<title>Tomcat 测试页面</title>
<meta charset="UTF-8">
<style>
body { font-family: Arial, sans-serif; margin: 40px; }
.container { max-width: 800px; margin: 0 auto; }
.success { color: #28a745; }
.info { background: #d1ecf1; padding: 15px; border-radius: 5px; }
</style>
</head>
<body>
<div class="container">
<h1 class="success">🎉 Tomcat 安装成功!</h1>
<div class="info">
<h2>服务器信息</h2>
<p><strong>时间:</strong> <%= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) %></p>
<p><strong>Java 版本:</strong> <%= System.getProperty("java.version") %></p>
<p><strong>Tomcat 版本:</strong> <%= application.getServerInfo() %></p>
<p><strong>系统架构:</strong> <%= System.getProperty("os.arch") %></p>
<p><strong>操作系统:</strong> <%= System.getProperty("os.name") %> <%= System.getProperty("os.version") %></p>
</div>
<h2>管理界面</h2>
<ul>
<li><a href="/manager/html">Manager App</a> - 应用管理</li>
<li><a href="/host-manager/html">Host Manager</a> - 虚拟主机管理</li>
</ul>
<h2>有用的链接</h2>
<ul>
<li><a href="https://tomcat.apache.org/">Apache Tomcat 官网</a></li>
<li><a href="https://tomcat.apache.org/tomcat-${TOMCAT_MAJOR_VERSION}-doc/index.html">Tomcat ${TOMCAT_MAJOR_VERSION} 文档</a></li>
</ul>
</div>
</body>
</html>
EOF
chown -R $TOMCAT_USER:$TOMCAT_GROUP $WEBAPPS_DIR/test
}
# 启动Tomcat服务
start_tomcat() {
log_info "启动Tomcat服务..."
systemctl enable tomcat
systemctl start tomcat
# 等待服务启动
sleep 10
if systemctl is-active --quiet tomcat; then
log_info "Tomcat 启动成功"
else
log_error "Tomcat 启动失败"
systemctl status tomcat
journalctl -u tomcat -n 50 --no-pager
exit 1
fi
}
# 验证安装
verify_installation() {
log_info "验证Tomcat安装..."
# 检查进程
if pgrep -f tomcat >/dev/null; then
log_info "Tomcat 进程运行正常"
else
log_error "未找到Tomcat进程"
exit 1
fi
# 检查端口监听
if netstat -tulpn | grep -q ':8080'; then
log_info "Tomcat 正在监听 8080 端口"
else
log_error "Tomcat 未在 8080 端口监听"
exit 1
fi
# 测试HTTP访问
if command -v curl >/dev/null 2>&1; then
if curl -s http://localhost:8080 >/dev/null; then
log_info "Tomcat HTTP 服务测试成功"
else
log_error "Tomcat HTTP 服务测试失败"
fi
# 测试测试应用
if curl -s http://localhost:8080/test/ | grep -q "安装成功"; then
log_info "测试应用访问成功"
fi
fi
log_info "安装完成!"
log_info "Tomcat 主页: http://$(curl -s ifconfig.me):8080"
log_info "测试应用: http://$(curl -s ifconfig.me):8080/test/"
log_info "管理界面: http://$(curl -s ifconfig.me):8080/manager/html"
log_info "服务管理: systemctl {start|stop|restart|status} tomcat"
log_info "日志文件: tail -f $INSTALL_DIR/tomcat/logs/catalina.out"
}
# 主函数
main() {
log_info "开始安装 Tomcat..."
# 检查root权限
if [ "$EUID" -ne 0 ]; then
log_error "请使用root权限运行此脚本"
exit 1
fi
# 选择Tomcat版本
echo "请选择Tomcat版本:"
echo "1) Tomcat 8"
echo "2) Tomcat 9 (推荐)"
echo "3) Tomcat 10"
read -p "请输入选择 [1-3]: " version_choice
case $version_choice in
1) TOMCAT_VERSION="8" ;;
2) TOMCAT_VERSION="9" ;;
3) TOMCAT_VERSION="10" ;;
*) log_info "使用默认版本: Tomcat 9" ;;
esac
detect_os
install_java
create_tomcat_user
install_tomcat
configure_tomcat
create_systemd_service
configure_firewall
# 询问是否配置SSL
read -p "是否配置SSL/TLS? (y/N): " ssl_choice
if [[ $ssl_choice =~ ^[Yy]$ ]]; then
configure_ssl
fi
create_test_app
start_tomcat
verify_installation
}
# 执行主函数
main "$@"
安装结果
bash
[root@localhost soft]# sh Tomcat_bash.sh
[INFO] 开始安装 Tomcat...
请选择Tomcat版本:
1) Tomcat 8
2) Tomcat 9 (推荐)
3) Tomcat 10
请输入选择 [1-3]: 2
[INFO] 检测到操作系统: centos 7
[INFO] 检查Java环境...
[INFO] Java 已安装: openjdk version "1.8.0_412"
[INFO] 创建Tomcat用户和组...
[INFO] 用户 tomcat 已存在
[INFO] 安装 Tomcat 9.0.85...
[INFO] 配置Tomcat...
[INFO] 创建systemd服务...
[INFO] 配置防火墙...
Warning: ALREADY_ENABLED: 8080:tcp
success
success
是否配置SSL/TLS? (y/n): n
[INFO] 创建测试应用...
[INFO] 启动Tomcat服务...
[INFO] Tomcat 启动成功
[INFO] 验证Tomcat安装...
[INFO] Tomcat 进程运行正常
[INFO] Tomcat 正在监听 8080 端口
[INFO] Tomcat HTTP 服务测试成功
[INFO] 测试应用访问成功
[INFO] 安装完成!
[INFO] Tomcat 主页: http://192.168.198.101:8080
[INFO] 测试应用: http://192.168.198.101:8080/test/
[INFO] 管理界面: http://192.168.198.101:8080/manager/html
[INFO] 服务管理: systemctl {start|stop|restart|status} tomcat
[INFO] 日志文件: tail -f /opt/tomcat/logs/catalina.out
🚀 快速安装方式
方法1:一键脚本安装
bash
# 下载脚本
wget -O install-tomcat.sh https://raw.githubusercontent.com/example/install-tomcat/master/install-tomcat.sh
# 添加执行权限
chmod +x install-tomcat.sh
# 运行安装
sudo ./install-tomcat.sh
方法2:分步快速安装
bash
# 1. 安装JDK
sudo apt update && sudo apt install -y openjdk-8-jdk
# 2. 下载Tomcat
cd /tmp
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.85/bin/apache-tomcat-9.0.85.tar.gz
# 3. 安装Tomcat
sudo tar -xzf apache-tomcat-9.0.85.tar.gz -C /opt
sudo mv /opt/apache-tomcat-9.0.85 /opt/tomcat
sudo useradd -r -s /bin/false tomcat
sudo chown -R tomcat:tomcat /opt/tomcat
# 4. 启动Tomcat
/opt/tomcat/bin/startup.sh
⚙️ 常用管理命令
bash
# 服务管理
sudo systemctl start tomcat # 启动
sudo systemctl stop tomcat # 停止
sudo systemctl restart tomcat # 重启
sudo systemctl status tomcat # 查看状态
sudo systemctl enable tomcat # 设置开机自启
# 日志查看
sudo tail -f /opt/tomcat/logs/catalina.out # 主日志
sudo tail -f /opt/tomcat/logs/localhost_access_log # 访问日志
# 应用部署
sudo cp myapp.war /opt/tomcat/webapps/ # 部署WAR包
sudo systemctl restart tomcat # 重启生效
📁 重要目录和文件
bash
/opt/tomcat/ # Tomcat安装目录
├── bin/ # 执行脚本
├── conf/ # 配置文件
│ ├── server.xml # 主配置文件
│ ├── tomcat-users.xml # 用户配置
│ └── web.xml # 全局web配置
├── logs/ # 日志文件
├── webapps/ # 应用部署目录
├── work/ # 工作目录
└── temp/ # 临时文件
🔧 常用配置修改
修改服务端口
bash
sudo vi /opt/tomcat/conf/server.xml
# 修改 Connector port="8080" 为其他端口
配置JVM参数
bash
sudo vi /opt/tomcat/bin/setenv.sh
# 添加: export JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx2048m"
添加数据库连接池
在 conf/server.xml
的 <GlobalNamingResources>
部分添加:
bash
<Resource name="jdbc/myDB"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb"
username="dbuser"
password="dbpass"
maxTotal="100"
maxIdle="30"
maxWaitMillis="10000"/>
🔍 安装验证
bash
# 检查服务状态
sudo systemctl status tomcat
# 检查端口监听
netstat -tulpn | grep 8080
# 测试Web访问
curl -I http://localhost:8080
# 查看版本信息
/opt/tomcat/bin/version.sh
# 检查应用列表
curl -s http://localhost:8080/manager/text/list | head -n 10
安装问题
bash
#日志:
Conflicting collector combinations in option list; please refer to the release notes for the combinations allowed
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
#解决: GC子系统最多只能选择一种垃圾收集策略。 注销GC配置 或 只能选择一种方式
# GC 配置
#export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:+DisableExplicitGC"
或
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC "
这个脚本提供了完整的Tomcat安装方案,包括安全配置、性能优化和服务管理,适合生产环境使用!