Linux环境下Tomcat故障排查指南
日志是故障排查的“指南针”,Tomcat的主要日志文件位于$CATALINA_HOME/logs目录下,其中:
tail -f $CATALINA_HOME/logs/catalina.out;grep 'ERROR' $CATALINA_HOME/logs/catalina.out;less $CATALINA_HOME/logs/catalina.out(按q退出)。确认Tomcat进程是否正在运行,以及端口是否处于监听状态:
ps -ef | grep tomcat(若未运行,需启动服务:$CATALINA_HOME/bin/startup.sh);sudo lsof -i :8080(若端口未监听,可能是启动失败或端口被占用)。系统资源不足会导致Tomcat无法正常运行:
free -h查看内存剩余量(若剩余内存不足,需调整JVM参数或增加物理内存);df -h查看磁盘使用率(若/分区剩余空间不足,需清理日志或临时文件);top查看CPU使用率(若CPU占用过高,可能是高并发请求或线程池配置不当)。现象:Tomcat启动时报错“Address already in use”(地址已被使用),或无法访问http://localhost:8080。
解决方法:
sudo lsof -i :8080(记录进程ID PID);kill -9 <PID>;$CATALINA_HOME/conf/server.xml,找到<Connector port="8080">标签,将8080改为其他未被占用的端口(如8081)。现象:Tomcat启动时报错“Neither JAVA_HOME nor JRE_HOME environment variable is defined”(未定义JAVA_HOME)。
解决方法:
java -version(需安装JDK,版本需与Tomcat兼容,如Tomcat 10需JDK 11+);~/.bashrc(或/etc/profile),添加以下内容:export JAVA_HOME=/usr/lib/jvm/java-11-openjdk # 替换为实际JDK路径
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$PATH
source ~/.bashrc。现象:Tomcat日志中出现“java.lang.OutOfMemoryError: Java heap space”(堆内存不足)或“java.lang.OutOfMemoryError: Metaspace”(元空间不足)。
解决方法:
$CATALINA_HOME/bin/catalina.sh,在文件头部添加以下内容(根据服务器内存调整数值):export JAVA_OPTS="-Xms512m -Xmx2048m -XX:MaxMetaspaceSize=512m"
(-Xms:初始堆内存;-Xmx:最大堆内存;-XX:MaxMetaspaceSize:元空间最大大小);jmap工具导出堆转储文件,再用jvisualvm或Eclipse MAT分析泄漏对象(如未关闭的数据库连接、缓存未清理)。现象:Tomcat启动时报错“org.xml.sax.SAXParseException”(XML解析错误),或无法正常加载配置。
解决方法:
server.xml、web.xml、context.xml),重点查看标签是否闭合、属性值是否用引号包裹;xmllint --noout $CATALINA_HOME/conf/server.xml(若报错,需修正语法);server.xml到conf目录)。现象:Tomcat启动时报错“Permission denied”(权限不足),或无法访问webapps目录下的应用。
解决方法:
chown -R tomcat:tomcat $CATALINA_HOME(将目录所有者改为tomcat用户,需提前创建tomcat用户:useradd -r -s /sbin/nologin tomcat);chmod +x $CATALINA_HOME/bin/*.sh;webapps目录有读写权限:chmod -R 755 $CATALINA_HOME/webapps。现象:Tomcat启动时报错“ClassNotFoundException”(类未找到)或“NoClassDefFoundError”(类定义未找到),或应用部署后出现功能异常。
解决方法:
WEB-INF/lib目录:确保应用所需的所有JAR包(如数据库驱动、Servlet API)已正确放置;find $CATALINA_HOME/webapps/your_app/WEB-INF/lib -name "*.jar" | sort | uniq -d查找重复的JAR包(如多个版本的log4j),删除冲突的版本;mvn dependency:tree(或gradle dependencies)检查依赖树,排除冲突的依赖(如<exclusions>标签)。适用场景:Tomcat响应缓慢、请求堆积(如线程池耗尽)。
操作步骤:
jps -l | grep Bootstrap(记录PID);jstack <PID> > thread_dump.log;jvisualvm或fastthread.io工具查看线程状态(如RUNNABLE表示正在运行,BLOCKED表示阻塞),定位死锁或长时间等待的线程。适用场景:频繁发生OutOfMemoryError,怀疑存在内存泄漏。
操作步骤:
jps -l | grep Bootstrap(记录PID);jmap -dump:format=b,file=heapdump.hprof <PID>;Eclipse MAT(Memory Analyzer Tool)打开heapdump.hprof,查看“Leak Suspects”报告,定位占用内存过多的对象(如未关闭的InputStream、缓存中的大量数据)。适用场景:需要长期监控Tomcat性能,及时发现瓶颈。
常用工具:
JMX Exporter采集Tomcat指标,用Grafana可视化展示(如请求吞吐量、响应时间、GC频率);