Tomcat的日志文件是故障排查的核心依据,其中**catalina.out**(位于$TOMCAT_HOME/logs目录)记录了启动、运行及关闭过程的详细信息。可使用以下命令实时查看最新日志:
tail -f $TOMCAT_HOME/logs/catalina.out
若需搜索特定错误(如OutOfMemoryError),可通过grep过滤:
grep "OutOfMemoryError" $TOMCAT_HOME/logs/catalina.out
日志中的错误堆栈(如NullPointerException、ClassNotFoundException)能直接指向问题根源(如代码缺陷、依赖缺失)。
Tomcat依赖JDK运行,需确保以下两点:
java -version命令确认已安装JDK(建议使用Java 8及以上版本),且版本符合Tomcat要求(如Tomcat 10需Java 11+)。JAVA_HOME是否指向正确的JDK路径(如/usr/lib/jvm/java-11-openjdk),并在/etc/profile或~/.bashrc中添加:export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$JAVA_HOME/bin:$PATH
执行source /etc/profile使配置生效。Tomcat的关键配置文件需逐一检查,避免语法错误或配置冲突:
server.xml:确认<Connector>标签的端口(默认8080)未被占用,SSL证书路径正确(若启用HTTPS),以及maxThreads(最大线程数)、connectionTimeout(连接超时)等参数符合业务需求。context.xml:检查应用上下文配置(如数据库连接池、资源路径)是否正确。web.xml:确认Servlet、Filter映射及初始化参数无错误。Tomcat默认使用8080(HTTP)、8005(关闭端口)、8009(AJP)端口,若这些端口被其他进程占用,会导致启动失败。使用以下命令检查端口占用情况:
netstat -tuln | grep ':8080\b'
若端口被占用(如PID=1234的nginx进程),可通过以下方式解决:
kill -9 1234;server.xml中的<Connector port="8080">为其他未被占用的端口(如8081)。firewalld,需开放Tomcat端口(以8080为例):sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
Enforcing模式(sestatus命令确认),可能阻止Tomcat访问网络或文件。可临时禁用(测试用):sudo setenforce 0
若问题解决,可永久禁用(修改/etc/selinux/config中的SELINUX=disabled)或调整策略(如setsebool -P tomcat_connect_any 1)。Tomcat运行需足够的内存、磁盘空间、CPU资源,可通过以下命令检查:
free -m(关注available列,确保剩余内存大于Tomcat配置的-Xmx值);df -h(确保/分区剩余空间大于1GB,避免日志或临时文件占满);top(关注%Cpu(s)列,避免长期超过80%)。Tomcat进程需对安装目录、webapps目录、日志目录有读写权限。建议将Tomcat运行用户设为tomcat(或nobody),并修改权限:
chown -R tomcat:tomcat $TOMCAT_HOME
chmod -R u+rwX $TOMCAT_HOME
若权限不足,可能导致启动时无法读取配置文件或写入日志。
若Tomcat日志中出现OutOfMemoryError(如java.lang.OutOfMemoryError: Java heap space),需调整JVM内存参数:
$TOMCAT_HOME/bin/catalina.sh,在JAVA_OPTS中增加堆内存(如-Xms512m -Xmx2048m,初始堆512MB、最大堆2GB);jmap生成堆转储文件,再用jhat或MAT(Eclipse Memory Analyzer)分析泄漏点:jmap -dump:live,format=b,file=heapdump.hprof $(pgrep -f tomcat)
jhat heapdump.hprof
浏览器访问http://localhost:7000查看泄漏对象(如大量未释放的Session、缓存)。通过以上步骤,可系统化排查CentOS下Tomcat的常见故障。若问题仍未解决,建议将日志中的关键错误信息(如异常类型、堆栈跟踪)发布到技术社区(如Stack Overflow),寻求针对性帮助。