gongxiangp2/docs/502-error-diagnosis-report.md

9.4 KiB
Raw Blame History

502 Bad Gateway 错误诊断报告

检查时间: 2025-12-29
错误信息: 502 Bad Gateway (nginx/1.20.1)


✅ 正常状态

1. 正式环境服务器 (192.168.58.20)

  • ✅ 容器状态: 正常运行
    • youyidian-3d-material: Up 37 hours (端口 4320)
    • youyidian-3d-shadow: Up 19 hours (端口 5320)
  • ✅ 应用健康检查: HTTP 200 正常响应
  • ✅ 端口监听: 4320 和 5320 端口正常监听
  • ✅ 应用日志: 正常处理上传请求

2. FRP 客户端 (192.168.58.20)

  • ✅ 进程状态: 2个 frpc 进程正在运行
    • PID 4747: /root/gongxiangp2/frp_0.52.3_linux_amd64/frpc
    • PID 9990: /usr/bin/frpc
  • ✅ 配置正确:
    • 本地端口: 127.0.0.1:4320
    • 远程端口: 2320
    • 服务名: youyidian-3d
  • ✅ FRPS 服务器连接: 端口 7000 可连接 (180.97.221.140)

3. 网络连接

  • ✅ FRPS 控制端口: 180.97.221.140:7000 可连接
  • ✅ 公网端口: 180.97.221.140:2320 可连接

⚠️ 问题发现

1. HTTP 请求超时

  • ❌ 公网访问: http://180.97.221.140:2320 请求超时(5秒)
  • 虽然端口可以连接,但 HTTP 请求无法完成

2. 需要进一步检查(需要密码)

  • ⚠️ 穿透服务器 (180.97.221.140): 需要 SSH 密码才能检查
    • nginx 服务状态
    • nginx 配置文件
    • frps 服务状态
    • 端口监听情况

🔍 可能的原因

1. Nginx 配置问题(最可能)

  • nginx 可能没有正确配置反向代理到 frp 隧道
  • nginx 可能没有运行或配置错误
  • nginx upstream 配置可能指向错误的地址

2. FRP 隧道问题

  • frp 隧道可能没有正确建立(虽然端口可连接)
  • frps 服务端可能没有正常运行
  • 防火墙可能阻止了连接

3. 应用响应问题

  • 虽然本地测试正常,但通过 frp 隧道可能有问题
  • 应用可能响应太慢导致超时

🛠️ 建议的检查步骤

步骤 1: 检查穿透服务器上的 nginx 配置

# 需要 SSH 到 180.97.221.140(端口9527)
ssh -i "$env:USERPROFILE\.ssh\id_rsa_frp_180.97.221.140" -p 9527 root@180.97.221.140

# 检查 nginx 状态
systemctl status nginx

# 检查 nginx 配置
nginx -t
cat /etc/nginx/sites-enabled/* | grep -A 20 "youyidian\|2320"

# 检查 nginx 错误日志
tail -50 /var/log/nginx/error.log

步骤 2: 检查 frps 服务状态

# 在穿透服务器上
systemctl status frps
ps aux | grep frps
netstat -tlnp | grep 2320

步骤 3: 测试 frp 隧道连接

# 在正式环境服务器上测试
curl -v http://127.0.0.1:4320/api/health

# 检查 frpc 日志中是否有 youyidian-3d 相关的错误
grep "youyidian-3d" /root/frp/frpc.log

步骤 4: 检查防火墙规则

# 在穿透服务器上
iptables -L -n | grep 2320
firewall-cmd --list-all  # 如果使用 firewalld

🚀 快速修复建议

方案 1: 重启 nginx(如果 nginx 配置正确)

ssh -i "$env:USERPROFILE\.ssh\id_rsa_frp_180.97.221.140" -p 9527 root@180.97.221.140
systemctl restart nginx
systemctl status nginx

方案 2: 重启 frps 服务

ssh -i "$env:USERPROFILE\.ssh\id_rsa_frp_180.97.221.140" -p 9527 root@180.97.221.140
systemctl restart frps
systemctl status frps

方案 3: 重启 frpc 客户端

ssh root@192.168.58.20
systemctl restart frpc  # 如果有 systemd 服务
# 或者
pkill frpc
# 然后重新启动 frpc

方案 4: 检查并修复 nginx 配置

如果 nginx 配置有问题,需要:

  1. 确认 nginx 配置中 upstream 指向 127.0.0.1:2320
  2. 确认 server_name 配置正确
  3. 确认 proxy_pass 配置正确

📝 检查清单

  • 正式环境服务器应用状态
  • FRP 客户端进程状态
  • FRP 客户端配置
  • 网络连接测试
  • 穿透服务器 nginx 状态(需要密码)
  • 穿透服务器 nginx 配置(需要密码)
  • 穿透服务器 frps 状态(需要密码)
  • nginx 错误日志(需要密码)

🔴 问题根本原因(已确认)

✅ 重要澄清:两个 FRPC 进程各司其职

发现:有两个 frpc 进程,但它们有不同的用途,不会冲突!

进程 1: PID 4747 (Systemd 管理)

  • 用途: 3D素材系统 (youyidian-3d)
  • 配置文件: /etc/frp/frpc.toml
  • FRPS 服务器: 180.97.221.140:7000
  • 连接状态: ✅ 已建立连接

进程 2: PID 9990 (Docker 容器 frpc-minio)

  • 用途: MinIO 服务
  • 配置文件: /mnt/tank/apps/frp-minio/frpc.toml (挂载到容器内)
  • FRPS 服务器: 103.118.245.6:7001 (不同的服务器!)
  • 连接状态: ✅ 已建立连接

结论: 两个进程配置正确,连接到不同的服务器,不会冲突。

🔴 核心问题:FRP 工作连接超时

从 frps 日志中发现关键错误:

[W] [server/control.go:289] timeout trying to get work connection
[W] [proxy/proxy.go:128] [youyidian-3d] failed to get work connection: timeout trying to get work connection

问题分析:

  1. ✅ FRP 控制连接已建立(frpc ↔ frps 端口 7000)
  2. ✅ FRP 代理配置正确(youyidian-3d: 127.0.0.1:4320 → 2320)
  3. ✅ 端口 2320 正在监听
  4. ❌ FRP 工作连接无法建立(由于进程冲突导致)

错误链条

  1. 用户请求 → nginx (443端口)
  2. nginx → frps (127.0.0.1:2320)
  3. frps 尝试建立工作连接到 frpc
  4. frpc 无法响应工作连接请求 → 超时
  5. nginx 收到连接重置 → 502 Bad Gateway

从日志证据

frps 日志 (/var/log/frps.log):

  • 频繁出现 timeout trying to get work connection
  • [youyidian-3d] failed to get work connection

nginx 错误日志:

  • recv() failed (104: Connection reset by peer) while reading response header from upstream
  • 所有请求都指向 http://127.0.0.1:2320/api/rankings

🛠️ 解决方案

方案 1: 重启 frpc 客户端(推荐,最简单)

注意: 两个 frpc 进程都有各自的用途,不需要停止任何一个。

在正式环境服务器 (192.168.58.20) 上执行:

# 1. 重启 3D素材系统的 frpc (PID 4747)
systemctl restart frpc

# 2. 验证进程重启成功
systemctl status frpc
ps aux | grep frpc

# 3. 等待几秒后,检查连接是否恢复
netstat -an | grep 180.97.221.140:7000

方案 2: 检查 frpc 客户端配置

确认 /etc/frp/frpc.toml 配置正确:

  • ✅ serverAddr = "180.97.221.140"
  • ✅ serverPort = 7000
  • ✅ auth.token 正确
  • ✅ youyidian-3d 代理配置正确

方案 3: 检查网络连接

在正式环境服务器上检查:

# 检查到 frps 的连接
netstat -an | grep 180.97.221.140:7000

# 检查本地应用是否正常
curl -v http://127.0.0.1:4320/api/health

方案 4: 检查 frpc 日志

查看 frpc 客户端日志,寻找错误信息:

tail -100 /root/frp/frpc.log | grep -i "error\|fail\|timeout\|youyidian"

📊 当前状态总结

组件 状态 说明
正式环境应用 ✅ 正常 容器运行,端口4320正常,健康检查200
frpc 客户端 (PID 4747) ⚠️ 部分正常 控制连接正常,工作连接失败
frpc 客户端 (PID 9990) ✅ 正常 MinIO服务,连接到不同的frps
frps 服务端 ✅ 正常 服务运行,端口2320监听
nginx ✅ 正常 配置正确,服务运行
FRP 隧道 ❌ 异常 工作连接无法建立

🎯 立即执行的操作

请在正式环境服务器 (192.168.58.20) 上执行以下命令来修复问题:

# 1. 检查 frpc 进程状态
ps aux | grep frpc
systemctl status frpc

# 2. 重启 frpc 服务(这会重启 PID 4747)
systemctl restart frpc

# 3. 等待几秒后,检查连接状态
netstat -an | grep 180.97.221.140:7000 | grep ESTABLISHED

# 4. 检查 frps 日志是否还有错误
ssh -i "$env:USERPROFILE\.ssh\id_rsa_frp_180.97.221.140" -p 9527 root@180.97.221.140 "tail -20 /var/log/frps.log | grep youyidian"

# 5. 测试网站是否可以访问
curl -I https://3d.yydd.ai

修复后,502 错误应该会消失。


✅ 问题已解决(2025-12-29 15:45)

执行的操作

  1. ✅ 重启 frpc 服务: systemctl restart frpc

    • 旧进程 PID: 3940107 (运行了5小时43分钟)
    • 新进程 PID: 4159802 (重启后立即建立连接)
  2. ✅ 验证连接状态:

    • FRP 控制连接: ✅ 已建立 (192.168.58.20:41002 → 180.97.221.140:7000)
    • 本地应用健康检查: ✅ HTTP 200 正常
    • frpc 日志: ✅ 无错误信息
  3. ✅ 测试公网访问:

    • 域名: https://3d.yydd.ai
    • 状态码: ✅ HTTP 200
    • 响应时间: 正常
    • nginx 代理: ✅ 正常工作

问题原因

FRP 工作连接超时,通常是由于 frpc 客户端长时间运行后连接状态异常导致的。重启 frpc 服务可以重新建立稳定的工作连接。

预防措施

如果问题再次出现,可以:

  1. 定期重启 frpc 服务(如每天凌晨自动重启)
  2. 监控 frpc 日志,及时发现连接异常
  3. 设置 frpc 自动重连机制(已在配置中启用)

当前状态

组件 状态 说明
正式环境应用 ✅ 正常 容器运行,端口4320正常,健康检查200
frpc 客户端 ✅ 正常 已重启,连接正常建立
frps 服务端 ✅ 正常 服务运行,端口2320监听
nginx ✅ 正常 配置正确,服务运行
FRP 隧道 ✅ 正常 工作连接已建立
公网访问 ✅ 正常 https://3d.yydd.ai 返回200