第一步:Tomcat 是否在运行?
这是最直接的原因,80% 的 502 都是后端服务挂了。
检查命令:
sudo systemctl status tomcat ps -ef | grep tomcat| 结果 | 结论 | 操作 |
|---|---|---|
| 服务未运行 | Tomcat 进程挂了 | 启动 Tomcat |
| 服务在运行 | 继续下一步排查 | 检查端口 |
第二步:端口 8080 是否开放?
Tomcat 虽然启动了,但端口可能没有监听(启动失败),或者被防火墙拦截。
检查端口:
sudo ss -tlnp | grep 8080| 结果 | 结论 | 操作 |
|---|---|---|
| 没有输出 | Tomcat 没有正常监听端口 | 查看 Tomcat 日志排查启动失败原因 |
| 有输出(LISTEN) | 端口正在监听 | 继续下一步 |
检查防火墙:
sudo firewall-cmd --list-all| 结果 | 结论 | 操作 |
|---|---|---|
ports: 8080/tcp | 端口已放行 | 继续下一步 |
| 没有 8080 | 防火墙拦截 | 放行端口:sudo firewall-cmd --permanent --add-port=8080/tcp |
第三步:后端服务是否正常响应?
即使 Tomcat 在运行、端口也开放了,还要确认它是否能正常处理请求。
测试连通性:
# 方法1:curl 测试 curl -v http://127.0.0.1:8080 方法2:telnet 测试 telnet 127.0.0.1 8080 方法3:nc 测试 nc -zv 127.0.0.1 8080| 结果 | 结论 | 操作 |
|---|---|---|
| 返回正常 HTML | 后端正常 | 检查 Nginx 配置 |
Connection refused | 后端进程挂了(端口没开) | 重启 Tomcat,查看日志 |
Connection timed out | 防火墙/网络拦截 | 检查防火墙、SELinux、云安全组 |
| 无响应/超时 | 后端处理太慢 | 调大 Nginx 超时时间 |
第四步:检查 Nginx 错误日志
如果前面都没问题,最后一步就是看 Nginx 日志。
sudo tail -50 /var/log/nginx/error.log关注这些关键词:
| 日志关键词 | 中文含义 | 根因 |
|---|---|---|
Connection refused | 连接被拒绝 | 后端进程挂了 |
Connection timed out | 连接超时 | 防火墙/网络问题 |
Permission denied | 权限拒绝 | SELinux 拦截 |
no live upstreams | 没有存活的后端 | 所有后端都挂了 |
upstream timed out | 上游超时 | 后端响应太慢 |
一键快速排查脚本
#!/bin/bash echo "========== 1. 检查 Tomcat 状态 ==========" sudo systemctl status tomcat --no-pager | head -5 echo "" echo "========== 2. 检查 8080 端口监听 ==========" sudo ss -tlnp | grep 8080 echo "" echo "========== 3. 测试后端连通性 ==========" curl -s -o /dev/null -w "HTTP状态码: %{http_code}\n" http://127.0.0.1:8080 --connect-timeout 3 echo "" echo "========== 4. 查看 Nginx 最近错误日志 ==========" sudo tail -10 /var/log/nginx/error.log📋 故障成因速查表
| Nginx error_log 报错 | 故障原因 | 解决方案 |
|---|---|---|
connect() failed (111: Connection refused) | 后端服务进程崩溃(端口没开) | sudo systemctl start tomcat,查看 catalina.out 日志 |
connect() failed (110: Connection timed out) | 防火墙/网络拦截(端口被屏蔽) | 检查firewall-cmd、iptables、SELinux、云安全组 |
Permission denied | SELinux 拦截 | sudo setenforce 0(测试),semanage port -a -t http_port_t -p tcp 8080(永久) |
upstream timed out (110: Connection timed out) | 后端处理请求超时(业务慢或死锁) | 调大proxy_read_timeout,优化后端代码 |
no live upstreams | upstream 定义的所有服务器都挂了 | 检查所有后端服务器,至少保证一台可用 |
🔧 常见解决方案
# 方案1:重启 Tomcat sudo systemctl restart tomcat #方案2:放行防火墙端口 sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload#方案3:调整 Nginx 超时时间(解决慢请求) # 在 location 块中添加: proxy_connect_timeout 60s; proxy_read_timeout 120s; proxy_send_timeout 60s; # 方案4:修复 SELinux sudo setenforce 0 # 临时关闭测试 sudo semanage port -a -t http_port_t -p tcp 8080 # 永久允许 sudo restorecon -Rv /opt/tomcat/ # 修复目录标签 # 方案5:重启 Nginx sudo systemctl restart nginx