在Linux环境下部署Java Web应用时,Tomcat始终是大多数开发者的首选方案。作为Apache软件基金会旗下的开源项目,Tomcat实现了Java Servlet和JSP规范,其轻量级、高性能的特性使其成为中小型Java Web项目的理想容器。我曾在生产环境中部署过上百个Tomcat实例,从版本6.x到最新的10.x,见证了它在性能优化和资源管理方面的持续进步。
与Jetty、Undertow等其他Java容器相比,Tomcat的优势在于:
提示:对于需要完整Java EE支持的企业级应用,建议考虑WildFly或Payara等应用服务器。但90%的Web应用使用Tomcat就已足够。
在开始安装前,建议先检查系统环境是否符合要求。执行以下命令查看Linux版本和Java环境:
bash复制# 查看系统版本
cat /etc/*release | grep PRETTY_NAME
uname -m
# 检查Java版本
java -version
javac -version
典型输出示例:
code复制PRETTY_NAME="Ubuntu 22.04.3 LTS"
x86_64
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 17.0.8+7-Ubuntu-0ubuntu122.04, mixed mode)
注意:Tomcat 10.1.x需要Java 11或更高版本。如果使用Tomcat 9.x,最低支持Java 8。建议优先选择LTS版本的OpenJDK。
为安全考虑,不建议直接使用root运行Tomcat。创建专用用户是个好习惯:
bash复制sudo groupadd tomcat
sudo useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat
这个命令创建了:
tomcattomcat(禁止登录shell)/opt/tomcat从Apache官网获取最新稳定版(当前为10.1.18):
bash复制wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.18/bin/apache-tomcat-10.1.18.tar.gz
# 验证文件完整性
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.18/bin/apache-tomcat-10.1.18.tar.gz.sha512
sha512sum -c apache-tomcat-10.1.18.tar.gz.sha512
正确的校验输出应为:
code复制apache-tomcat-10.1.18.tar.gz: OK
解压并设置目录权限:
bash复制sudo mkdir -p /opt/tomcat
sudo tar xzvf apache-tomcat-10.1.18.tar.gz -C /opt/tomcat --strip-components=1
# 设置权限
cd /opt/tomcat
sudo chgrp -R tomcat conf
sudo chmod g+rwx conf
sudo chmod g+r conf/*
sudo chown -R tomcat webapps/ work/ temp/ logs/
关键目录说明:
bin/:启动/停止脚本conf/:配置文件(server.xml等)webapps/:应用部署目录logs/:日志文件temp/:临时文件work/:JSP编译输出编辑/opt/tomcat/conf/server.xml,重点关注以下配置:
xml复制<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="200"
minSpareThreads="10"
acceptCount="100"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/css,application/javascript"/>
参数说明:
maxThreads:最大并发处理线程数(根据CPU核心数调整)minSpareThreads:最小空闲线程数acceptCount:等待队列长度compression:启用Gzip压缩提升传输效率在/opt/tomcat/bin/setenv.sh中设置JVM参数(文件不存在则新建):
bash复制export CATALINA_OPTS="-server -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
内存分配建议:
创建/etc/systemd/system/tomcat.service:
ini复制[Unit]
Description=Apache Tomcat 10
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
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
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
启用服务:
bash复制sudo systemctl daemon-reload
sudo systemctl start tomcat
sudo systemctl enable tomcat
验证服务状态:
bash复制systemctl status tomcat
curl -I http://localhost:8080
预期输出应包含:
code复制HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
删除默认管理应用:
bash复制rm -rf /opt/tomcat/webapps/host-manager
rm -rf /opt/tomcat/webapps/manager
如果使用firewalld:
bash复制sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
bash复制sudo chmod 750 /opt/tomcat/bin/*
sudo chmod 640 /opt/tomcat/conf/*
查看详细日志:
bash复制tail -n 100 /opt/tomcat/logs/catalina.out
常见错误及解决方案:
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
| Address already in use | 端口冲突 | 修改server.xml中的端口号 |
| JAVA_HOME not defined | Java环境未配置 | 设置JAVA_HOME环境变量 |
| Permission denied | 文件权限问题 | 检查tomcat用户权限 |
通过jconsole连接Tomcat进程监控:
setenv.sh中添加:bash复制export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
bash复制jconsole localhost:9010
将编译好的WAR包复制到webapps目录:
bash复制sudo cp your-app.war /opt/tomcat/webapps/
sudo chown tomcat:tomcat /opt/tomcat/webapps/your-app.war
Tomcat会自动解压WAR包,访问路径为:
code复制http://server_ip:8080/your-app/
在conf/server.xml中添加Context配置:
xml复制<Context path="/myapp" docBase="/path/to/your/app"
reloadable="true" crossContext="true"/>
设置reloadable="true"后,修改类文件会自动重新加载应用(开发环境适用)。
使用logrotate管理catalina.out:
创建/etc/logrotate.d/tomcat:
bash复制/opt/tomcat/logs/catalina.out {
daily
rotate 30
missingok
compress
copytruncate
dateext
create 640 tomcat tomcat
}
在conf/server.xml中修改AccessLogValve:
xml复制<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %D ms" />
其中%D记录请求处理时间(毫秒),对性能分析特别有用。
启用Tomcat自带的监控接口:
conf/tomcat-users.xml:xml复制<role rolename="manager-status"/>
<user username="monitor" password="complex-password" roles="manager-status"/>
code复制http://localhost:8080/manager/status
在setenv.sh中添加以下参数预防内存泄漏:
bash复制export CATALINA_OPTS="$CATALINA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat/logs/"
当OOM发生时,会自动生成堆转储文件供分析。
经过多年实践验证,这套配置方案在2核4G的云服务器上可稳定支撑日均50万PV的Web应用。关键是要根据实际负载情况动态调整线程池和内存参数,建议配合监控系统持续优化。