前置说明
网关错误(如502 Bad Gateway、504 Gateway Timeout、400 Bad Request等)通常表示客户端与后端服务器之间的中间组件(负载均衡器、反向代理、API网关)无法从上游服务器获得有效响应。以下排错步骤从外到内、从网络层到应用层逐步展开,适用于IDC环境下的常见场景。
排错全步骤
第一步:确认错误类型与范围
首先记录完整的HTTP状态码及错误页面信息。例如:
- 502 Bad Gateway:网关或代理从上游收到无效响应。
- 504 Gateway Timeout:网关未在超时时间内收到上游响应。
- 503 Service Unavailable:服务临时不可用(可能伴随网关问题)。
确认错误是否影响所有用户、单个IP段,或仅特定浏览器/客户端,以缩小排查范围。
第二步:检查客户端网络与DNS
使用客户端设备执行以下验证:
- 本地网络连通性:
ping <服务器IP> 确认基本可达性。 - DNS解析:
nslookup <域名> 或 dig <域名> 确认解析到正确IP。 - 路由追踪:
tracert(Windows)或 traceroute(Linux)查看中间节点有无丢包或高延迟。
第三步:检查中间网络设备与防火墙
在IDC网络内,重点关注:
- 负载均衡器/反向代理:检查其健康检查配置、后端服务器池状态。确认后端服务器是否都被标记为“down”。
- 防火墙/安全组:确保未误拦截源IP、端口(如80/443)或ICMP。检查是否有速率限制(Rate Limit)触发。
- 路由与NAT:核实网关设备的路由表,确保回程路由正确。
第四步:检查后端服务器状态
登录后端服务器(如果可直达)执行:
- 进程与端口:
netstat -tlnp 或 ss -tlnp 确认Web服务进程(如Nginx、Apache、Tomcat)是否监听在正确端口。 - 系统资源:
top、free -m、df -h 检查CPU、内存、磁盘是否耗尽。资源不足可能导致服务无响应,进而触发网关超时。 - 连接数:
ss -s 或 netstat -an | grep :80 | wc -l 查看当前连接数是否超过服务上限。
第五步:分析应用日志与错误信息
重点关注以下日志:
- Web服务器错误日志:如Nginx的
error.log,Apache的 error_log。通常能直接给出“upstream timed out”、“connection refused”等线索。 - 应用日志:例如PHP-FPM日志、Java Tomcat catalina.out、Python uWSGI日志。查找数据库连接失败、超时、500内部错误等。
- 系统日志:
journalctl -xe 或 /var/log/messages 查看有无OOM Killer、磁盘I/O错误等。
第六步:测试直接访问后端
绕过中间层,直接对后端服务器发起请求(如修改hosts文件或使用内部IP):
- 使用 curl 测试:
curl -v http://后端IP:端口/路径 观察响应码与时间。 - 若直接访问正常,问题锁定在网关或中间网络配置;若同样异常,则后端本身存在问题。
第七步:检查超时与缓冲区配置
网关设备的超时参数是常见原因:
- proxy_read_timeout(Nginx):等待后端响应的最大时间,默认为60秒。若后端处理慢(如大数据查询),可能触发504。
- proxy_connect_timeout:与后端建立连接的超时时间。
- proxy_send_timeout:向上游发送请求的超时时间。
根据业务特性适当调大这些值,并确定后端处理时间是否在合理范围内。
总结
网关错误排错需遵循“由外到内、层层隔离”的原则:先验证客户端网络,再检查中间设备,最后深入后端服务与日志。常见根因包括:后端服务挂起、资源耗尽、防火墙拦截、超时配置过短等。建议将排查步骤标准化,结合监控告警系统提升响应效率。