您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档。 信息
问题
客户端应用收到 502 Bad Gateway 错误。如果消息处理器未收到来自后端服务器的响应,则客户端应用会返回此错误。
错误消息
客户端应用会收到以下响应代码:
HTTP/1.1 502 Bad Gateway
此外,您可能还会看到以下错误消息:
{
"fault": {
"faultstring":"Bad Gateway",
"detail":{
"errorcode":"messaging.adaptors.http.flow.BadGateway"
}
}
}
可能的原因
下表列出了此问题的可能原因:
原因 | 说明 | 可通过 |
TLS/SSL 握手超时 | 在消息处理器和后端服务器之间的 TLS/SSL 握手期间会出现超时。 | Edge Private 和公有云用户 |
原因:TLS/SSL 握手超时
在 Apigee Edge 中,您可以设置与后端服务器的 TLS/SSL 连接,以启用边缘消息处理器和后端服务器之间的 TLS 通信。
TLS/SSL 握手涉及多个步骤。当消息处理器和后端服务器之间的 TLS/SSL 握手超时时,通常会发生此错误。
诊断
本部分介绍如何正确诊断 TLS/SSL 握手超时。 我们列出了针对 Edge Private Cloud 和公有云的说明。
调查跟踪会话输出
以下步骤说明了如何使用 Apigee Edge Trace 工具对问题进行初步诊断。
- 在 Edge 界面中,为受影响的 API 代理启用 Trace 会话。
如果失败 API 请求的跟踪记录显示以下内容,则很可能发生了 TLS/SSL 握手超时错误。错误的可能原因是后端服务器防火墙阻止了来自 Apigee 的流量。
- 确定在 55 秒(这是消息处理器上设置的默认超时期限)后是否发生 502 Bad Gateway 错误。如果您看到错误在 55 秒后发生,这就表示超时可能是导致问题的原因。
- 确定错误是否显示故障:messaging.adaptors.http.BadGateway。 同样,此错误通常表示发生了超时。
如果您使用的是 Edge Private Cloud,请记下跟踪记录输出中 X-Apigee.Message-ID 字段的值,如下所示。Private Cloud 用户可以使用此 ID 值进一步排查问题,如后文所述。
点击轨迹路径中的 Analytics Data Recorded(分析的数据记录)图标:
向下滚动,记下名为 X-Apigee.Message-ID 的字段的值。
如需确认 TLS/SSL 握手超时是导致错误的原因,请根据您是在公有云还是私有云上,按照下面几部分中的步骤进行操作。
仅适用于 Edge Private Cloud 用户的其他诊断步骤
如果您使用的是 Apigee Edge Private Cloud,则可以执行以下步骤,以帮助验证握手错误的原因。在此步骤中,您将检查 Message Processor 日志文件以获取相关信息。如果您使用的是 Edge 公有云,则可以跳过此部分并参阅适用于私有云和公有云用户的进一步诊断步骤。
检查您能否使用
telnet
命令直接从每个消息处理器连接到特定的后端服务器:如果后端服务器解析为单个 IP 地址,请使用以下命令:
telnet BackendServer-IPaddress 443
如果后端服务器解析为多个 IP 地址,请在 telnet 命令中使用后端服务器的主机名,如下所示:
telnet BackendServer-HostName 443
如果您能够连接到后端服务器而没有任何错误,请继续下一步。
如果
telnet
命令失败,您需要与网络团队一起检查消息处理器和后端服务器之间的连接情况。检查消息处理器日志文件,以获取握手失败的证据。打开文件:
/opt/apigee/var/log/edge-message-processor/system.log
然后搜索唯一消息 ID(您在跟踪文件中找到的 X-Apigee.Message-ID 值)。确定您是否看到与消息 ID 相关的握手错误消息,如下所示:
org:xxx env:xxx api:xxx rev:x messageid:<MESSAGE_ID> NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context.handshakeTimeout() : SSLClientChannel[Connected: Remote:X.X.X.X:443 Local:X.X.X.X]@739028 useCount=1 bytesRead=0 bytesWritten=0 age=55221ms lastIO=55221ms isOpen=true handshake timeout
如果您在消息处理器的日志文件中看到此错误,请继续进一步调查。请参阅适用于 Edge 私有云和公有云用户的更多诊断步骤。
如果您在日志文件中没有看到握手消息,请转到必须收集诊断信息
适用于 Edge Private 和公有云用户的更多诊断步骤
为了进一步查明问题,您可以使用 tcpdump 工具分析 TCP/IP 数据包,以确认 TLS/SSL 握手期间是否发生了超时。
- 如果您是私有云用户,则可以捕获后端服务器或消息处理器上的 TCP/IP 数据包。最好在后端服务器上捕获这些数据包,因为数据包会在后端服务器上解密。
- 如果您是公有云用户,则无权访问消息处理器;但是,在后端服务器上捕获 TCP/IP 数据包可能有助于查明问题。
确定在哪里捕获 TCP/IP 数据包后,使用以下 tcpdump 命令捕获 TCP/IP 数据包。
tcpdump -i any -s 0 host <IP address> -w <File name>
使用 Wireshark 工具或类似工具分析 TCP/IP 数据包。以下屏幕截图显示了 Wireshark 中的 TCP/IP 数据包。
请注意,在 Wireshark 输出中,前 3 个数据包中的三次 TCP 握手成功完成。
然后,消息处理器会在数据包 #4 中发送“Client Hello”消息。
由于后端服务器未进行确认,因此消息处理器会在等待预定义的时间间隔后,在数据包 5、6 和 7 中多次重新传输“Client Hello”消息。
如果消息处理器在重试 3 次后未收到任何确认,便会向后端服务器发送 FIN, ACK 消息,以表明它正在关闭连接。
如 Wireshark 会话示例中所示,与后端的连接成功(第 1 步),但是,由于后端服务器从未响应,SSL 握手超时。
如果您执行了本 playbook 中的问题排查步骤,并且确定某个超时导致了 TLS/SSL 握手错误,请前往解决方案部分。
使用 API 监控发现问题
借助 API 监控功能,您可以快速隔离问题领域,以诊断错误、性能和延迟问题及其来源,例如开发者应用、API 代理、后端目标或 API 平台。
逐步完成一个示例场景,该场景演示了如何使用 API Monitoring 排查 API 的 5xx 问题。例如,您可能需要设置提醒,以便在 messaging.adaptors.http.BadGateway 故障数量超过特定阈值时收到通知。
分辨率
通常情况下,SSL 握手超时是因为后端服务器上的防火墙限制阻止来自 Apigee Edge 的流量。如果您按照诊断步骤操作,并确定了握手错误的原因是超时的,则需要与您的网络团队合作以确定原因并修复防火墙限制。
请注意,防火墙限制可能会在不同的网络层施加。请务必移除与消息处理器 IP 相关的所有网络层限制,以确保流量在 Apigee Edge 与后端服务器之间平稳流动。
如果没有防火墙限制并且/或问题仍然存在,请转到必须收集诊断信息。
必须收集诊断信息
如果在按照上述说明操作后问题仍然存在,请收集以下诊断信息。请与 Apigee Edge 支持团队联系并分享相关信息:
- 如果您是公有云用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 完成 curl 命令以重现错误
- 显示错误的跟踪文件
- 在后端服务器上捕获的 TCP/IP 数据包
- 如果您是 Private Cloud 用户,请提供以下信息:
- 观察到了完整的错误消息
- API 代理软件包
- 显示错误的跟踪文件
- Message Processor 日志 /opt/apigee/var/log/edge-message-processor/logs/system.log
- 在后端服务器或消息处理器上捕获的 TCP/IP 数据包。
- 详细说明您尝试了本手册的哪些部分,以及其他任何有助于我们快速解决此问题的数据分析。