Tomcat在CentOS系统中的故障主要涉及启动失败、无法访问、性能异常三大类,以下是针对性的排查步骤与解决方法:
查看Tomcat日志
日志是故障定位的核心依据,Tomcat日志默认位于$CATALINA_HOME/logs目录(如/opt/tomcat/logs)。关键日志文件包括:
catalina.out:记录启动、运行及关闭过程的详细信息;localhost.<date>.log:记录应用部署、上下文初始化等上下文相关日志;manager.<date>.log/host-manager.<date>.log:记录管理界面的操作日志。tail -f catalina.out实时查看最新日志,或less catalina.out搜索关键词(如“ERROR”“Exception”)快速定位问题。检查Java环境
Tomcat依赖Java运行环境,需确保:
java -version,确认输出Java版本(建议使用JDK 8或11,与Tomcat版本兼容);JAVA_HOME环境变量配置正确:在~/.bashrc或/etc/profile中添加export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk(路径以实际安装位置为准),并执行source ~/.bashrc使配置生效;$CATALINA_HOME/bin/setenv.sh(若有),确保其中JAVA_HOME配置与全局环境变量一致。检查Tomcat配置文件
核心配置文件server.xml(位于$CATALINA_HOME/conf)的错误会导致启动失败,需重点检查:
<Connector>标签:确认port属性(如8080)未被占用,protocol(如HTTP/1.1或org.apache.coyote.http11.Http11Nio2Protocol)配置正确;<Context>标签:检查应用部署路径(path属性)是否合法,避免重复或冲突;xmllint --noout server.xml验证文件语法是否正确。检查文件与目录权限
Tomcat需对安装目录及文件有读写权限,建议将Tomcat目录所有者设置为tomcat用户(若未创建,需先执行useradd tomcat):
sudo chown -R tomcat:tomcat /opt/tomcat # 替换为实际Tomcat安装路径
sudo chmod -R 755 /opt/tomcat # 授予读写执行权限
若以root用户启动Tomcat,虽能解决权限问题,但存在安全风险,建议使用专用用户运行。
检查端口占用
Tomcat默认使用8080端口(HTTP)、8005端口(关闭命令)、8009端口(AJP)。若端口被占用,启动会失败。使用以下命令检查端口占用情况:
sudo netstat -tuln | grep ':8080\b' # 精确匹配8080端口
sudo lsof -i:8080 # 查看占用端口的进程ID(PID)
若端口被占用,可选择:
sudo kill -9 <PID>;server.xml中的<Connector port="8080">,将端口号改为未被占用的值(如8081)。检查SELinux状态
CentOS默认启用SELinux(安全增强模块),可能阻止Tomcat访问网络或文件。使用sestatus命令检查SELinux状态:
Enforcing,可临时禁用(测试用):sudo setenforce 0;/etc/selinux/config,将SELINUX=enforcing改为SELINUX=permissive,然后重启服务器。setsebool -P tomcat_connect_any 1)而非完全禁用。检查系统资源
系统资源不足(如磁盘空间、内存)会导致Tomcat无法启动:
df -h,确保根分区(/)剩余空间大于10%;free -m,确保可用内存足够(建议至少1GB以上,根据Tomcat配置调整)。确认Tomcat是否启动
查看Tomcat日志(catalina.out)中是否有“Server startup in [xxx] milliseconds”的启动成功日志;或使用ps -ef | grep tomcat检查Tomcat进程是否存在。
检查防火墙设置
CentOS防火墙(firewalld或iptables)可能阻止外部访问Tomcat端口。以firewalld为例,开放8080端口:
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent # 永久添加规则
sudo firewall-cmd --reload # 重新加载规则
若使用iptables,执行sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT并保存规则。
验证访问路径
确保访问的URL格式正确:http://<服务器IP>:8080(若修改了端口,需替换为实际端口);若部署了应用,需在路径后添加应用上下文(如http://<服务器IP>:8080/myapp)。
高CPU占用
top命令查看CPU使用率最高的进程(Tomcat进程通常为java);jstack <PID>(<PID>为Tomcat进程ID)获取线程转储,分析是否有线程死锁或长时间处于RUNNABLE状态(如大量请求等待数据库响应);server.xml中的<Executor>):调整maxThreads(最大线程数,建议为CPU核心数×20~25)、minSpareThreads(核心线程数,建议为CPU核心数×5~10);内存问题(OOM/频繁GC)
jmap -heap <PID>查看堆内存使用情况,确认是否超过-Xmx(最大堆内存)限制;jstat -gcutil <PID> 1000(每秒刷新一次)查看GC频率,若FGC(Full GC)次数过多,说明存在内存泄漏;jmap -dump:format=b,file=heap.hprof <PID>导出堆转储文件,通过MAT(Memory Analyzer Tool)或VisualVM分析内存泄漏点(如未释放的对象);catalina.sh中的JAVA_OPTS):调整-Xms(初始堆内存,建议与-Xmx一致,避免频繁扩容)、-Xmx(最大堆内存,建议为物理内存的70%~80%)、-XX:+UseG1GC(使用G1垃圾回收器,适合大内存场景)。静态资源处理慢
conf/web.xml,在<servlet>标签(servlet-name为default)中添加:<init-param>
<param-name>cacheMaxSize</param-name>
<param-value>10240</param-value> <!-- 缓存大小(KB) -->
</init-param>
<init-param>
<param-name>cacheTTL</param-name>
<param-value>86400000</param-value> <!-- 缓存时间(毫秒,24小时) -->
</init-param>
conf/server.xml的<Connector>标签中添加compression="on"、compressionMinSize="2048"(最小压缩大小,单位字节)、compressableMimeType="text/html,text/xml,text/css,application/javascript";通过以上步骤,可覆盖CentOS环境下Tomcat的常见故障场景。排查时需遵循“从外到内、从浅到深”的原则,优先检查基础配置(日志、Java环境、端口),再逐步深入到性能优化层面。若问题仍未解决,可结合具体错误日志进一步分析。