CentOS环境下Tomcat故障排查指南
Tomcat的日志是故障排查的核心依据,日志文件通常位于$CATALINA_HOME/logs目录下(如/opt/tomcat/logs),主要包括:
catalina.out为例):tail -f $CATALINA_HOME/logs/catalina.out
通过日志中的错误堆栈、异常类型(如NullPointerException、PortAlreadyInUseException),可快速定位问题根源(如配置错误、端口冲突、依赖缺失)。
Tomcat依赖Java环境运行,需确保以下配置正确:
java -version,确认已安装JDK(建议使用JDK 8及以上版本),且版本符合Tomcat要求(如Tomcat 10需JDK 11+);echo $JAVA_HOME,应指向JDK安装路径(如/usr/lib/jvm/java-11-openjdk);若未设置,需在~/.bashrc或/etc/profile中添加:export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$JAVA_HOME/bin:$PATH
执行source ~/.bashrc使配置生效。Tomcat默认使用8080端口(HTTP)、8005端口(关闭命令)、8009端口(AJP),若端口被其他进程占用,会导致启动失败。
netstat -tuln | grep ':8080\b'(替换为目标端口),查看占用进程的PID;kill -9 <PID>终止进程;$CATALINA_HOME/conf/server.xml,找到<Connector>标签(如<Connector port="8080" protocol="HTTP/1.1">),修改port属性为未使用的端口(如8081)。Tomcat的配置文件(如server.xml、context.xml、web.xml)若存在语法错误(如标签未闭合、属性值缺失),会导致启动失败。
vi)打开配置文件,检查标签格式(如<Connector>是否闭合)、属性值(如port是否为数字);org.apache.catalina.startup.ContextConfig.parseWebXml: Parse error in application web.xml file at jndi:/localhost/app/WEB-INF/web.xml:30:23),根据提示修改对应文件。Tomcat需要对安装目录、日志目录、webapps目录有读写执行权限,否则会导致启动失败或无法访问。
tomcat用户运行(推荐),需将目录所有者设置为tomcat:sudo chown -R tomcat:tomcat $CATALINA_HOME
sudo chmod -R 755 $CATALINA_HOME
logs目录需授予777权限(确保Tomcat可写入日志):sudo chmod -R 777 $CATALINA_HOME/logs
CentOS默认启用SELinux(安全增强模块),可能阻止Tomcat访问网络、文件或端口。
sudo setenforce 0,将SELinux设置为permissive模式(仅记录违规行为,不阻止),重启Tomcat后若能正常运行,说明是SELinux问题;/etc/selinux/config,将SELINUX=enforcing改为SELINUX=permissive,重启服务器;sudo semanage port -a -t http_port_t -p tcp 8080
(需安装policycoreutils-python-utils包:sudo yum install policycoreutils-python-utils)。系统资源不足(如内存耗尽、磁盘空间满、CPU占用过高)会导致Tomcat启动缓慢或无法启动。
free -m,查看可用内存(available列),若剩余内存不足(如小于1GB),需关闭其他占用内存的程序,或调整Tomcat的JVM内存参数(见“JVM内存优化”);df -h,查看根分区(/)的使用率,若超过80%,需清理日志文件(如/var/log)或无用数据;top,查看CPU占用率,若某进程占用过高(如超过80%),需终止该进程或优化其性能。CentOS的firewalld或iptables可能阻止外部访问Tomcat端口(如8080),导致无法访问。
sudo firewall-cmd --zone=public --list-ports,查看是否允许Tomcat端口;sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent(永久生效),然后sudo firewall-cmd --reload(重新加载规则);sudo systemctl stop firewalld,若此时能访问Tomcat,说明是防火墙问题。JVM内存不足会导致Tomcat启动缓慢、频繁Full GC、内存溢出(OutOfMemoryError)。
$CATALINA_HOME/bin/setenv.sh(若不存在则创建),添加以下内容(根据服务器内存调整):export JAVA_OPTS="-Xms512m -Xmx1024m -XX:MaxPermSize=256m -XX:+UseG1GC"
其中:
-Xms512m:初始堆大小(512MB);-Xmx1024m:最大堆大小(1024MB);-XX:MaxPermSize=256m:永久代大小(适用于Tomcat 8及以下);-XX:+UseG1GC:使用G1垃圾回收器(适用于Tomcat 9及以上);jps查看Tomcat进程ID,再运行jmap -heap <PID>,确认内存参数是否生效。Tomcat启动时会加载webapps目录下的所有应用,不必要的应用会增加启动时间和资源消耗;冗余的XML配置(如server.xml中的重复<Valve>标签)也会影响性能。
webapps目录下未使用的WAR包或目录(如examples、docs);$CATALINA_HOME/conf/server.xml,将Host标签中的autoDeploy="true"改为autoDeploy="false";server.xml中未使用的<Connector>、<Context>标签,合并重复的<Valve>配置(如AccessLogValve)。