tomcat启动失败、java -version报错、nginx转发404/502,主因是java_home配置错误或未生效,以及proxy_pass末尾斜杠缺失/冗余导致路径拼接异常;须验证jdk路径真实性、source /etc/profile生效、echo $java_home与java -version双确认,且proxy_pass结尾有/才可剥离location前缀正确转发。

Tomcat 启动失败、java -version 报错、Nginx 转发后页面 404 或 502,八成是环境变量或 proxy_pass 路径没对齐——不是 JDK 没装,而是 JAVA_HOME 指向错误或未生效;不是 Nginx 配错了,而是 proxy_pass 后面多/少/斜杠导致路径拼接异常。
JAVA_HOME 配错或未生效的典型表现
Tomcat 启动时直接报 No JAVA_HOME 或 Unable to find a Java Runtime Environment;执行 java -version 显示命令未找到,但 /usr/java/jdk1.8.0_201-amd64/bin/java -version 却能运行成功。
- 确认 JDK 安装路径是否真实存在:
ls /usr/java/jdk1.8.0_201-amd64,别直接抄网上的路径,版本号和架构(amd64/arm64)必须匹配 -
/etc/profile中的JAVA_HOME必须用绝对路径,且不能带空格或中文,例如:export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64 - 改完后必须执行
source /etc/profile,否则新终端才生效;当前终端不生效就等于没配 - 验证是否生效:运行
echo $JAVA_HOME和java -version,两个都返回预期结果才算过关
nginx.conf 中 proxy_pass 路径带/与不带/的区别
这是 Nginx + Tomcat 反向代理最常踩的坑:请求 URL 是 /api/user,但 Tomcat 实际只监听 /user,结果 404;或者请求本该进 ROOT 应用,却转发到了 /ROOT/api/user,结果 500。
-
proxy_pass http://127.0.0.1:8080;(结尾无/):Nginx 会把location /api/的完整 URI(含/api)原样拼到后端地址后,即转发为http://127.0.0.1:8080/api/user -
proxy_pass http://127.0.0.1:8080/;(结尾有/):Nginx 会剥离location匹配前缀,再拼接,即location /api/ { proxy_pass http://127.0.0.1:8080/; }会把/api/user转为http://127.0.0.1:8080/user - Tomcat 默认应用部署在
webapps/ROOT,所以若想让example.com/直接访问 ROOT,location /对应的proxy_pass尾部必须加/,否则会变成http://127.0.0.1:8080//(双斜杠),触发 502
Tomcat 多实例共存时 server.xml 端口冲突检查点
启动第二个 Tomcat 实例时报 Address already in use: bind,说明至少一个端口被占。Tomcat 的 server.xml 里有 3 个关键端口必须互斥:
-
Server port(默认 8005):用于 shutdown 命令通信,每个实例必须不同,如 8005 / 8006 -
Connector port(默认 8080):HTTP 请求入口,如 8080 / 8081,Nginx 的proxy_pass必须指向这个端口 -
AJP port(默认 8009):如果用 AJP 协议反代(非主流),也得改,如 8009 / 8010 - 改完后务必用
netstat -tuln | grep :8081确认端口未被其他进程占用,再启动 Tomcat
SELinux 和防火墙导致 502 的排查顺序
Nginx 日志里出现 connect() failed (13: Permission denied) 或 Connection refused,但 curl http://127.0.0.1:8080 在本机能通,大概率是 SELinux 拦截了 Nginx 进程的网络 outbound 权限,或防火墙没放行 Tomcat 端口。
- 临时关闭 SELinux 测试:
setenforce 0;若恢复后正常,说明需永久放行:setsebool -P httpd_can_network_connect 1 - 检查防火墙是否放行 Tomcat 端口(如 8081):
firewall-cmd --list-ports;没看到就加:firewall-cmd --add-port=8081/tcp --permanent && firewall-cmd --reload - 不要只查 Nginx 的 80 端口是否开放——那是客户端进来的路,真正要通的是 Nginx 出去连 Tomcat 的那条路
最麻烦的不是配置写错,而是改了配置却不重启对应服务,或者重启了但没检查日志:Nginx 要 nginx -t && systemctl reload nginx,Tomcat 要 ./shutdown.sh && ./startup.sh,然后立刻看 tail -f logs/catalina.out 和 journalctl -u nginx -f,否则所有“看起来没问题”的操作都是空中楼阁。











