温馨提示×

Tomcat在CentOS上的错误排查技巧

小樊
51
2026-01-02 04:34:39
栏目: 智能运维

Tomcat 在 CentOS 上的错误排查技巧

一 快速定位流程

  • 确认进程与系统服务状态:使用命令查看 Tomcat 进程 是否存在(如:ps -aux | grep tomcat),若使用 systemd 管理则执行 systemctl status tomcat,正常应看到包含 org.apache.catalina.startup.Bootstrap 的 Java 进程。
  • 查看关键日志:进入 $CATALINA_HOME/logs,优先 tail -f catalina.outlocalhost.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 200302
  • 外部访问与网络策略:从外部机器 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 后执行即可快速获取系统、端口、日志与网络的关键状态。

0