Tomcat运行需要Java环境支持,建议安装JDK 11或更高版本(以Ubuntu系统为例):

sudo apt update sudo apt install openjdk-11-jdk # 安装OpenJDK 11 java -version # 验证安装,应显示类似"openjdk 11.0.xx"
注意:不同Linux发行版安装命令可能不同:
- CentOS/RHEL:
sudo yum install java-11-openjdk-devel- Arch Linux:
sudo pacman -S jdk11-openjdk- macOS (使用Homebrew):
brew install openjdk@11
# 解压第一个Tomcat实例 tar -xzf apache-tomcat-9.0.xx.tar.gz sudo mv apache-tomcat-9.0.xx /opt/tomcat1 # 解压第二个Tomcat实例(需要重新解压原始压缩包) tar -xzf apache-tomcat-9.0.xx.tar.gz sudo mv apache-tomcat-9.0.xx /opt/tomcat2 # 设置目录权限 sudo chmod -R 755 /opt/tomcat*
(Tomcat多实例架构示意图,展示了多个实例共享JDK但独立运行的原理)
每个Tomcat实例必须使用唯一的端口组合,修改conf/server.xml文件:
| 配置项 | 默认端口 | 修改示例(增量+10) | 作用说明 |
|---|---|---|---|
| HTTP连接器 | 8080 | 8081 | Web服务端口 |
| AJP连接器 | 8009 | 8010 | Apache JServ协议端口 |
| Shutdown端口 | 8005 | 8006 | 安全关闭端口 |
| Redirect端口 | 8443 | 8444 | HTTPS重定向端口 |
快速修改命令(以tomcat2为例):
sudo sed -i 's/8080/8081/g' /opt/tomcat2/conf/server.xml sudo sed -i 's/8009/8010/g' /opt/tomcat2/conf/server.xml sudo sed -i 's/8005/8006/g' /opt/tomcat2/conf/server.xml sudo sed -i 's/8443/8444/g' /opt/tomcat2/conf/server.xml
为每个实例设置独立的环境变量,编辑~/.bashrc或/etc/profile文件:
# Tomcat1配置 export CATALINA_HOME1=/opt/tomcat1 export CATALINA_BASE1=/opt/tomcat1 export PATH=$PATH:$CATALINA_HOME1/bin # Tomcat2配置 export CATALINA_HOME2=/opt/tomcat2 export CATALINA_BASE2=/opt/tomcat2 export PATH=$PATH:$CATALINA_HOME2/bin # 使配置生效 source ~/.bashrc
/opt/tomcat1/bin/startup.sh # 启动第一个实例 /opt/tomcat2/bin/startup.sh # 启动第二个实例
# 查看进程 ps -ef | grep tomcat # 检查端口占用 sudo netstat -tulnp | grep java # 或使用更现代的ss命令 sudo ss -tulnp | grep java # 检查启动日志 tail -f /opt/tomcat1/logs/catalina.out tail -f /opt/tomcat2/logs/catalina.out
在浏览器中访问:
http://your_server_ip:8080http://your_server_ip:8081(Tomcat默认欢迎页面,验证实例运行状态)
每个Tomcat实例会自动在各自的logs/目录下生成独立日志:
catalina.out: 主运行日志localhost_access_log.*.txt: 访问日志localhost.*.log: 应用日志manager.*.log: 管理控制台日志建议配置日志轮转(以tomcat1为例):
# 创建日志轮转配置
sudo tee /etc/logrotate.d/tomcat1 <<'EOF'
/opt/tomcat1/logs/catalina.out {
daily
rotate 30
missingok
compress
delaycompress
notifempty
copytruncate
}
EOF创建Systemd服务文件实现开机自启(以tomcat1为例):
# /etc/systemd/system/tomcat1.service [Unit] Description=Apache Tomcat 9.0 Instance 1 After=network.target syslog.target [Service] Type=forking Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64" Environment="CATALINA_PID=/opt/tomcat1/temp/tomcat.pid" Environment="CATALINA_HOME=/opt/tomcat1" Environment="CATALINA_BASE=/opt/tomcat1" Environment="CATALINA_OPTS=-Xms512M -Xmx1024M" ExecStart=/opt/tomcat1/bin/startup.sh ExecStop=/opt/tomcat1/bin/shutdown.sh User=tomcat Group=tomcat UMask=0007 RestartSec=10 Restart=always [Install] WantedBy=multi-user.target
启用服务:
sudo systemctl daemon-reload sudo systemctl start tomcat1 sudo systemctl enable tomcat1 sudo systemctl status tomcat1
(Systemd服务管理流程示意图)
在bin/setenv.sh中设置JVM参数(文件不存在则创建):
#!/bin/sh # Tomcat1内存配置 export JAVA_OPTS="$JAVA_OPTS -server -Xms512m -Xmx1024m" export JAVA_OPTS="$JAVA_OPTS -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m" export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:+DisableExplicitGC" export JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"
症状:启动时报Address already in use错误
解决方案:
# 查找占用端口的进程 sudo lsof -i :8080 # 或使用更直观的工具 sudo apt install net-tools # 如果尚未安装 sudo netstat -tulnp | grep 8080 # 解决方案: # 1. 终止冲突进程 sudo kill -9 <PID> # 2. 或修改Tomcat配置使用其他端口
症状:Permission denied错误
解决方案:
# 创建专用用户并授权 sudo groupadd tomcat sudo useradd -g tomcat -d /opt/tomcat1 -s /bin/false tomcat sudo chown -R tomcat:tomcat /opt/tomcat1 sudo chmod -R u+rwx,g+rx,o-rwx /opt/tomcat1 # 检查SELinux状态(仅限RHEL/CentOS) sudo sestatus # 如果启用,可能需要调整策略 sudo chcon -R -t tomcat_exec_t /opt/tomcat1/bin
症状:OutOfMemoryError或性能低下
解决方案:调整JVM参数:
# 在setenv.sh中增加内存设置 export JAVA_OPTS="-Xms1G -Xmx2G -XX:+UseG1GC" export JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError" export JAVA_OPTS="$JAVA_OPTS -XX:HeapDumpPath=/opt/tomcat1/logs/heapdump.hprof" # 监控内存使用 jstat -gc <tomcat_pid> 1000 10
安全建议:
webapps/examples, webapps/docs)性能建议:
监控建议:
高可用建议:
通过以上步骤,您可以在单台Linux服务器上成功部署多个独立的Tomcat实例,每个实例都可以独立运行不同的Java Web应用,实现资源隔离和灵活管理,这种架构特别适合需要隔离不同应用环境(如开发、测试、生产)或需要为不同客户提供独立服务的场景。