CentOS 上 Tomcat 配置错误的排查与修复指南
一、快速定位问题
- 查看日志:第一时间检查 $CATALINA_HOME/logs/catalina.out 与 localhost.<日期>.log,从堆栈与异常关键词定位配置项或应用问题。
- 核对 Java:执行 java -version,确认已安装且与所用 Tomcat 版本匹配(如 Tomcat 10+ 需 JDK 11+)。
- 校验配置:重点审查 conf/server.xml(端口、连接器)、context.xml(上下文路径)、web.xml(应用参数)。
- 资源与端口:用 top/free/df 看资源,用 netstat -tulpen | grep 8080 查端口占用与进程 PID。
- 外部访问:确认 firewalld/SELinux 未阻断访问。
以上步骤能覆盖大多数配置类故障的初步定位。
二、常见错误与修复对照表
| 症状 |
高发原因 |
快速修复 |
| 启动失败或端口占用 |
端口被占用、重复启动 |
查占用:netstat -tulpen |
| 访问返回 404 |
应用未部署、上下文路径错误 |
确认 WAR 在 webapps,目录或 ROOT 映射正确;检查 Host/Context 配置 |
| 访问不了服务器 |
防火墙/SELinux 拦截 |
放行端口:firewall-cmd --zone=public --add-port=8080/tcp --permanent && firewall-cmd --reload;SELinux 排障可临时 setenforce 0 |
| 启动极慢或 shutdown 卡住 |
JVM 随机数生成阻塞 |
在 $JAVA_HOME/jre/lib/security/java.security 将 securerandom.source 改为 file:/dev/urandom |
| 页面空白或中文乱码 |
日志/控制台编码不当 |
在 conf/logging.properties 设置 java.util.logging.ConsoleHandler.encoding=GBK |
| 启动报错 JAVA_HOME 未定义 |
环境变量缺失 |
在 /etc/profile 或 systemd 服务中设置 JAVA_HOME(指向实际 JDK 路径) |
| 版本不兼容 |
Tomcat 与 JDK 版本不匹配 |
统一版本:如 Tomcat 10+ 需 JDK 11+ |
| 权限不足 |
目录属主/权限错误 |
chown -R tomcat:tomcat $CATALINA_HOME;chmod -R 755 相关目录 |
| 依赖冲突或类加载失败 |
应用与 Tomcat 自带库冲突 |
清理冲突 JAR(如 jasper-el.jar 与 EL API 冲突场景),保持依赖一致 |
| 多个 Tomcat 实例异常 |
AJP/端口/Secret 配置冲突 |
各实例使用不同 SHUTDOWN/AJP/HTTP 端口;AJP 按需设置 secretRequired 或保持一致的安全配置 |
以上条目对应日志、端口、防火墙、编码、权限、版本与多实例等高频场景,可逐项对照执行。
三、配置修复与优化示例
- 放行访问端口(firewalld)
- 命令:firewall-cmd --zone=public --add-port=8080/tcp --permanent && firewall-cmd --reload
- 调整 HTTP 端口(server.xml)
- 以 systemd 托管并设置 JAVA_HOME 与内存
- 创建服务文件 /etc/systemd/system/tomcat.service,关键片段:
- Environment=JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
- Environment=CATALINA_HOME=/opt/tomcat
- Environment=CATALINA_BASE=/opt/tomcat
- Environment=‘JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom’
- Environment=‘CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC’
- User=tomcat; Group=tomcat
- 生效与启停:systemctl daemon-reload && systemctl start tomcat && systemctl enable tomcat
- 解决启动慢(随机数阻塞)
- 编辑 $JAVA_HOME/jre/lib/security/java.security:securerandom.source=file:/dev/urandom
- 解决中文乱码(日志)
- 编辑 conf/logging.properties:java.util.logging.ConsoleHandler.encoding=GBK
- 多实例端口规划
- 分别修改 Server port=“8005”、Connector port=“8080”、AJP/1.3 port=“8009”,避免冲突。
四、仍未解决时的高效求助方式
- 准备并贴出:
- 关键日志片段:catalina.out、localhost.<日期>.log
- 相关配置:server.xml/context.xml 中与问题相关的片段
- 环境信息:cat /etc/redhat-release、java -version、Tomcat 版本与部署方式(tar 包或 yum)
- 复现步骤与现象描述(访问 URL、返回码、时间点)
- 说明已尝试的措施(端口、防火墙、权限、版本核对等),便于快速定位。