日志是排查Tomcat异常的核心依据,Debian下Tomcat日志通常位于/var/log/tomcatX/目录(X为版本号,如tomcat9)。关键日志文件及作用:
OutOfMemoryError、ClassNotFoundException),使用tail -f /var/log/tomcatX/catalina.out实时查看最新日志,grep -i "error\|exception" /var/log/tomcatX/catalina.out筛选错误信息。使用ps aux | grep tomcat命令查看Tomcat进程是否运行:
sudo systemctl restart tomcat(或/opt/tomcat/bin/startup.sh)重启。Z僵尸进程),需终止异常进程(sudo kill -9 <PID>)后重启。Tomcat默认使用8080端口(HTTP)、8005端口(关闭命令)、8009端口(AJP),若端口被占用,会导致启动失败。使用以下命令检查:
sudo netstat -tuln | grep ':8080\b' # 替换8080为实际端口
# 或
sudo ss -tuln | grep ':8080\b'
若端口被占用,通过lsof -i :8080找到占用进程ID,终止该进程(sudo kill -9 <PID>),或修改/etc/tomcatX/server.xml中的Connector端口配置(如将port="8080"改为port="8081")。
Tomcat的核心配置文件位于/etc/tomcatX/(或/opt/tomcat/conf/),重点检查:
Connector元素的port、protocol、redirectPort配置正确(如HTTP端口是否冲突);Host元素的name(如localhost)与appBase(如webapps)路径是否存在。<servlet>、<servlet-mapping>配置是否正确(如类名拼写、URL映射路径)。Resource元素)的url、username、password是否正确,驱动路径是否存在。Tomcat依赖JAVA_HOME(JDK路径)和CATALINA_HOME(Tomcat安装路径)环境变量,若未正确设置,会导致启动失败:
JAVA_HOME:运行echo $JAVA_HOME,应指向JDK安装目录(如/usr/lib/jvm/java-11-openjdk-amd64);若未设置,在~/.bashrc或/etc/environment中添加:export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64,然后source ~/.bashrc生效。CATALINA_HOME:运行echo $CATALINA_HOME,应指向Tomcat安装目录(如/opt/tomcat);若未设置,在~/.bashrc中添加:export CATALINA_HOME=/opt/tomcat,然后source ~/.bashrc生效。Tomcat运行异常可能因系统资源不足(CPU、内存、磁盘空间):
top或htop命令查看Tomcat进程的CPU、内存占用率(如%CPU超过80%、RES内存超过Xmx设置);若内存不足,调整setenv.sh(位于/opt/tomcat/bin/)中的JVM参数:export JAVA_OPTS="-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m"(Xms初始堆大小,Xmx最大堆大小)。df -h检查/var/log(日志目录)、/opt/tomcat/webapps(应用目录)所在分区剩余空间,若剩余空间小于10%,需清理日志(如rm -rf /var/log/tomcatX/*.log)或应用文件。若Tomcat启动正常但访问应用(如http://localhost:8080/myapp)失败,需检查:
/opt/tomcat/webapps/目录下,且名称正确(如myapp.war);若部署失败,查看localhost.YYYY-MM-DD.log中的部署错误(如Deployment failure)。lib目录下的jar包),确认依赖是否完整;若存在版本冲突,使用Maven/Gradle管理依赖(如mvn dependency:tree查看冲突)。tomcat)对应用目录有读取权限(sudo chown -R tomcat:tomcat /opt/tomcat/webapps/myapp)。若上述步骤无法定位问题,可使用以下工具:
grep、awk筛选关键日志(如grep -A 10 "ERROR" /var/log/tomcatX/catalina.out),或使用ELK Stack(Elasticsearch+Logstash+Kibana)集中管理日志。jstack $(pgrep -f tomcat)生成线程转储,分析线程死锁(如deadlock关键字);使用jmap -dump:format=b,file=/tmp/heap.hprof $(pgrep -f tomcat)生成堆转储,分析内存泄漏(如使用Eclipse MAT查看大对象)。