Tomcat 自动化脚本安装方案

以下是 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安装方案,包括安全配置、性能优化和服务管理,适合生产环境使用!
相关推荐
七夜zippoe5 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy6487 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满7 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠7 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey9037 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技9 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀9 小时前
Linux环境变量
linux·运维·服务器
zzzsde9 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º11 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~11 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化