您正在查看 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 Cloud 和 Public Cloud 用户 |
原因:TLS/SSL 握手超时
在 Apigee Edge 中,您可以设置与后端服务器的 TLS/SSL 连接,以启用边缘消息处理器和后端服务器之间的 TLS 通信。
TLS/SSL 握手涉及多个步骤。当消息处理器和后端服务器之间的 TLS/SSL 握手超时时,通常会发生此错误。
诊断
本部分介绍了如何正确诊断 TLS/SSL 握手超时问题。列出了适用于 Edge Private Cloud 和 Public Cloud 的说明。
调查跟踪会话输出
以下步骤介绍了如何使用 Apigee Edge Trace 工具对问题进行初步诊断。
- 在 Edge 界面中,为受影响的 API 代理启用轨迹会话。
如果失败的 API 请求的轨迹显示以下内容,则可能发生了 TLS/SSL 握手超时错误。错误的可能原因是后端服务器防火墙阻止了来自 Apigee 的流量。
- 确定是否在 55 秒(消息处理器上设置的默认超时期限)后发生 502 Bad Gateway 错误。如果您发现错误是在 55 秒后发生的,则表示超时可能是问题的原因。
- 确定错误是否显示了故障:messaging.adaptors.http.BadGateway。再次强调,此错误通常表示发生了超时。
如果您使用的是 Edge Private Cloud,请记下轨迹输出中的 X-Apigee.Message-ID 字段的值,如下所示。私有云用户可以使用此 ID 值进行进一步的问题排查,如后文所述。
点击轨迹路径中的 Analytics Data Recorded 图标:
向下滚动,记下名为 X-Apigee.Message-ID 的字段的值。
如需确认 TLS/SSL 握手超时是导致错误的原因,请根据您使用的是公共云还是私有云,按照以下部分中的步骤操作。
仅限 Edge Private Cloud 用户的额外诊断步骤
如果您使用的是 Apigee Edge Private Cloud,可以执行以下步骤来帮助验证握手错误的原因。在此步骤中,您需要检查消息处理器日志文件,以获取相关信息。如果您使用的是 Edge Public Cloud,可以跳过此部分,然后前往面向私有云和公共云用户的进一步诊断步骤。
检查您能否使用
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 Private 和 Public Cloud 用户的进一步诊断步骤。
如果您在日志文件中没有看到握手消息,请转到必须收集诊断信息
适用于 Edge 私有云和公有云用户的进一步诊断步骤
如需进一步查明问题,您可以使用 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 输出中,三向 TCP 握手在前 3 个数据包中成功完成。
然后,消息处理器将发送数据包 #4 中的“Client Hello”消息。
由于后端服务器没有确认,消息处理器会在等待预定义的时间间隔后,在数据包 5、6 和 7 中多次重新传输“Client Hello”消息。
如果消息处理器在 3 次重试后未收到任何确认,则会向后端服务器发送 FIN, ACK 消息,以指示它正在关闭连接。
如 Wireshark 会话示例所示,与后端的连接已成功(第 1 步),但 SSL 握手超时,因为后端服务器从未响应。
如果您已执行此 Playbook 中的问题排查步骤,并确定超时导致了 TLS/SSL 握手错误,请参阅解决方法部分。
使用 API 监控发现问题
借助 API Monitoring,您可以快速隔离问题领域,以诊断错误、性能和延迟问题及其来源,例如开发者应用、API 代理、后端目标或 API 平台。
逐步演示一个示例场景,该场景演示了如何使用 API 监控功能排查 API 的 5xx 问题。例如,您可能希望设置提醒,以便在 messaging.adaptors.http.BadGateway 错误数量超过特定阈值时收到通知。
分辨率
通常,SSL 握手超时是因为后端服务器上的防火墙限制阻止了来自 Apigee Edge 的流量。如果您按照诊断步骤操作,并确定握手错误的原因是超时,则需要与网络团队联系,以确定原因并修正防火墙限制。
请注意,防火墙限制可能会在不同的网络层施加。请务必移除所有网络层中与消息处理器 IP 相关的限制,以确保 Apigee Edge 和后端服务器之间流畅的流量传输。
如果没有防火墙限制,并且/或者问题仍然存在,请前往必须收集诊断信息。
必须收集的诊断信息
如果按照上述说明操作后问题仍然存在,请收集以下诊断信息。请与 Apigee Edge 支持团队联系并向其提供相关信息:
- 如果您是公有云用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 完成 curl 命令以重现错误
- 显示错误的跟踪文件
- 在后端服务器上捕获的 TCP/IP 数据包
- 如果您是 Private Cloud 用户,请提供以下信息:
- 观察到的完整错误消息
- API 代理软件包
- 显示错误的轨迹文件
- 消息处理器日志 /opt/apigee/var/log/edge-message-processor/logs/system.log
- 在后端服务器或消息处理器上捕获的 TCP/IP 数据包。
- 详细说明您已尝试本手册中的哪些部分,以及任何其他有助于我们快速解决此问题的分析洞见。