Tomcat 在 CentOS 上的错误排查技巧
一 快速定位流程
- 确认进程与系统服务状态:使用命令查看 Tomcat 进程 是否存在(如:ps -aux | grep tomcat),若使用 systemd 管理则执行 systemctl status tomcat,正常应看到包含 org.apache.catalina.startup.Bootstrap 的 Java 进程。
- 查看关键日志:进入 $CATALINA_HOME/logs,优先 tail -f catalina.out、localhost.log,必要时查看 localhost_access_log。
- 核对监听端口:确认配置端口(默认 8080)与监听状态,命令如 ss -tunlp | grep java 或 netstat -tunlp | grep java;同时 grep -A 5 “<Connector port” $CATALINA_HOME/conf/server.xml 查看配置。
- 本机连通性自检:执行 curl -I http://localhost:8080,预期 HTTP/1.1 200 或 302。
- 外部访问与网络策略:从外部机器 curl -I http://<服务器IP>:8080;若仅本地可访问,排查 firewalld/安全组/网络路由。
- 应用部署校验:ls -l $CATALINA_HOME/webapps/ 检查 WAR/目录;必要时访问 /manager/html 验证(需配置用户权限)。
- 版本与权限:java -version 核对 Tomcat 与 JDK 兼容性(如:Tomcat 10.x → Java 11+,Tomcat 9.x → Java 8+);目录权限建议 tomcat:tomcat。
以上步骤覆盖了大多数“起不来/访问不到”的根因定位路径。
二 常见故障与修复对照表
| 现象 |
快速检查 |
修复建议 |
| 进程不存在或启动即停 |
catalina.out 报错、端口未监听 |
先看日志定位异常;必要时前台启动 ./catalina.sh run 观察输出 |
| Address already in use(端口冲突) |
lsof -i:8080 或 ss -tunlp |
结束占用进程(kill -9 )或修改 server.xml 的 |
| 本地可访问,外部不可 |
本机 curl 正常、外部超时 |
firewall-cmd --permanent --add-port=8080/tcp && firewall-cmd --reload;检查云安全组 |
| 403/404 页面异常 |
访问 /manager.html 或应用路径 |
配置 tomcat-users.xml 角色权限;检查 webapps 是否有 ROOT.war 或对应目录 |
| 启动缓慢(虚拟机常见) |
dmesg/日志无明显报错但卡 |
安装 haveged 提升熵池:sudo yum install -y haveged && sudo systemctl enable --now haveged |
| 关闭时报错或卡死 |
端口占用、权限不足、进程残留 |
查 8005/8080 占用;用正确的用户执行关闭;必要时 kill 残留进程后再启动 |
| 以上对照表对应的命令与处置均为 CentOS 常用实践。 |
|
|
三 日志与 JVM 问题排查
- 日志优先级:优先分析 catalina.out(启动主日志)、localhost.log(应用部署与初始化)、访问日志用于流量核对。
- 内存溢出 OOM:
- 堆内存不足:java.lang.OutOfMemoryError: Java heap space → 适度增大 -Xms/-Xmx,如 -Xms512m -Xmx1024m;同时优化应用内存使用与缓存策略。
- 元空间不足(Java 8 及以后使用 Metaspace):OutOfMemoryError: Metaspace → 设置 -XX:MaxMetaspaceSize=…。
- 无法创建新线程:检查系统 ulimit -u(用户最大进程数)、容器/系统限制与线程栈设置(-Xss),必要时下调并发或优化线程模型。
- GC 与内存分析:使用 jstat -gcutil 1000 观察 GC 与健康度;发生 OOM 时用 jmap -dump:live,format=b,file=heap.hprof 导出堆转储并用 MAT/jhat 分析;也可结合 VisualVM/JConsole 远程监控。
- 版本不兼容:出现 UnsupportedClassVersionError 多为 JDK 版本过低,按版本矩阵升级 JDK(如 Tomcat 10 需 Java 11+)。
- 前台启动便于捕捉异常:在 $CATALINA_HOME/bin 执行 ./catalina.sh run,可直接看到标准输出与异常堆栈。
四 系统与网络层面的排查
- 资源与磁盘:df -h 检查根分区与日志盘是否 磁盘满;du -sh $CATALINA_HOME/logs 定位大日志,清理历史 catalina.out/localhost*.log 后再启。
- 端口与进程:lsof -i:8080 或 ss -tunlp | grep java 查占用;必要时 kill -9 释放端口。
- 防火墙与 SELinux:firewall-cmd --list-all 核对放行规则,必要时 firewall-cmd --permanent --add-port=8080/tcp && firewall-cmd --reload;仅测试时可临时 setenforce 0,长期方案请按需配置 SELinux 布尔值或策略。
- 监听地址:确认 server.xml 中 Connector 未错误绑定到 127.0.0.1,避免仅本地可达。
- 云环境:核对 安全组/NACL 是否放行 8080/8005 等端口。
五 一键排查脚本示例
#!/usr/bin/env bash
set -Eeuo pipefail
export CATALINA_HOME="${CATALINA_HOME:-/opt/tomcat}"
echo "=== 1) 进程状态 ==="
ps -aux | grep -E 'java.*catalina' || echo "未检测到 Tomcat 进程"
echo "=== 2) 关键日志尾部 ==="
tail -n50 "$CATALINA_HOME/logs/catalina.out" 2>/dev/null || echo "无法读取 catalina.out"
tail -n50 "$CATALINA_HOME/logs/localhost.log" 2>/dev/null || echo "无法读取 localhost.log"
echo "=== 3) 端口与监听 ==="
ss -tunlp | grep -E ':(8080|8005|8009)' || echo "未检测到 Tomcat 端口监听"
grep -A5 '<Connector port' "$CATALINA_HOME/conf/server.xml" 2>/dev/null || echo "未找到 Connector 配置"
echo "=== 4) 本机连通性 ==="
curl -I --max-time 5 http://localhost:8080 || echo "本机访问失败"
echo "=== 5) 防火墙与 SELinux ==="
sudo firewall-cmd --list-all 2>/dev/null || echo "firewalld 未运行或无权限"
getenforce 2>/dev/null || echo "SELinux 状态未知"
echo "=== 6) 磁盘与日志占用 ==="
df -h | head -n2
du -sh "$CATALINA_HOME/logs" 2>/dev/null || echo "无法统计 logs 目录大小"
将脚本保存为 diagnose.sh,赋权 chmod +x 后执行即可快速获取系统、端口、日志与网络的关键状态。