Ubuntu下Tomcat故障排查实操手册
一 快速定位流程
ps aux | grep tomcat、sudo netstat -tulpen | grep 8080 或 sudo ss -tulpen | grep 8080。若端口被占用,使用 sudo lsof -i :8080 找到占用进程并处置。tail -f、grep -i error、less 分页定位异常堆栈与时间点。curl -I http://localhost:8080;从外部主机 ping 与 curl 目标IP:端口,排除网络与路由问题。sudo ufw status、sudo ufw allow 8080/tcp;云主机还需检查安全组规则。df -h、内存 free -m;确认运行用户对 $CATALINA_HOME(常见为 /opt/tomcat 或 /var/lib/tomcat)及子目录具备读写权限。二 常见故障与处理对照表
| 症状 | 快速检查 | 处理建议 |
|---|---|---|
| 启动即退出或提示 Neither JAVA_HOME nor JRE_HOME | java -version、echo $JAVA_HOME |
安装匹配版本的 JDK,正确设置环境变量(见下一节);必要时在 bin/setclasspath.sh 中显式导出 JAVA_HOME/JRE_HOME |
| 端口被占用无法启动 | sudo lsof -i :8080、`netstat -tulpen |
grep 8080` |
| localhost能访问,外网访问不了 | 服务器 curl 正常、外部 curl 超时 |
检查 ufw/iptables、云安全组、以及云服务器实例的本地防火墙策略 |
| 页面空白或报类/资源找不到 | 查看 localhost.[日期].log 与应用的日志 |
检查应用的 context path、web.xml、静态资源映射与打包是否完整 |
| 启动慢或偶发崩溃 | free -m、df -h、GC日志 |
调整 JVM内存 与 GC 策略,清理磁盘,分离日志与数据目录 |
| 日志乱码 | 查看 catalina.out 编码 |
在 conf/logging.properties 设置 java.util.logging.ConsoleHandler.encoding=UTF-8 |
以上对照基于 Tomcat 在 Ubuntu 的常见实践,涵盖端口、Java 环境、网络连通、权限与日志等关键点。
三 日志与配置的关键位置
org.apache.catalina.core 等设为 FINE/WARN/ERROR;也可通过 JVM 参数设置日志级别。JAVA_OPTS="-Xms512m -Xmx1024m"(按机器内存合理调整)。<Connector port="8080" ... /> 以规避冲突。四 Java环境与权限的坑
java -version 确认可用;若报 Neither JAVA_HOME nor JRE_HOME,需在用户环境(~/.bashrc、~/.profile)或 bin/setclasspath.sh 中导出 JAVA_HOME/JRE_HOME,并确保 JDK 版本与 Tomcat 版本匹配。五 一键排查脚本示例
#!/usr/bin/env bash
set -Eeuo pipefail
CATALINA_HOME="${CATALINA_HOME:-/opt/tomcat}"
PORT=8080
echo "=== Tomcat 快速排查 ==="
echo "[1/6] Java"
java -version || { echo "未找到 Java"; exit 1; }
echo "[2/6] 进程与端口"
ps aux | grep -i tomcat || echo "未检测到 Tomcat 进程"
ss -tulpen | grep -E "(:$PORT|\b$PORT\b)" || echo "端口 $PORT 未被监听"
echo "[3/6] 本机连通性"
curl -I --max-time 5 http://localhost:$PORT || echo "本机访问 $PORT 失败"
echo "[4/6] 防火墙"
sudo ufw status || true
echo "[5/6] 磁盘与内存"
df -h | awk '$NF=="/"{printf "根分区使用率: %s\n", $5}'
free -m | awk 'NR==2{printf "可用内存: %s MB\n", $7}'
echo "[6/6] 最近错误日志"
LOGFILE="$CATALINA_HOME/logs/catalina.out"
[ -f "$LOGFILE" ] && tail -n 50 "$LOGFILE" | grep -i -E 'error|exception|fail' || echo "未找到日志: $LOGFILE"
将脚本保存为 tomcat-check.sh,执行 bash tomcat-check.sh 即可按序输出关键诊断信息。