502 网关超时错误

您正在查看 Apigee Edge 文档。
前往 Apigee X 文档
信息

问题

客户端应用收到 502 网关无效错误。如果消息处理器未收到来自后端服务器的响应,则会向客户端应用返回此错误。

出错提示

客户端应用会收到以下响应代码:

HTTP/1.1 502 Bad Gateway

此外,您可能会看到以下错误消息:

{
 "fault": {
    "faultstring":"Bad Gateway",
    "detail":{
        "errorcode":"messaging.adaptors.http.flow.BadGateway"
    }
 }
}

可能的原因

下表列出了此问题的可能原因:

原因 说明 问题排查步骤可由以下人员执行
TLS/SSL 握手超时 消息处理器与后端服务器之间的 TLS/SSL 握手期间发生超时。 Edge Private 和 Public Cloud 用户

原因:TLS/SSL 握手超时

在 Apigee Edge 中,您可以设置与后端服务器的 TLS/SSL 连接,以在 Edge 消息处理器和后端服务器之间启用 TLS 通信。

TLS/SSL 握手涉及多个步骤。当消息处理器与后端服务器之间的 TLS/SSL 握手超时时,通常会发生此错误。

诊断

本部分介绍了如何正确诊断 TLS/SSL 握手超时问题。系统会列出 Edge Private Cloud 和 Public Cloud 的相关说明。

调查跟踪会话输出

以下步骤介绍了如何使用 Apigee Edge Trace 工具对问题进行初步诊断。

  1. 在 Edge 界面中,为受影响的 API 代理启用跟踪会话
  2. 如果失败的 API 请求的轨迹显示以下内容,则很可能发生了 TLS/SSL 握手超时错误。此错误的可能原因是后端服务器防火墙正在阻止来自 Apigee 的流量。

    1. 确定 502 Bad Gateway 错误是否在 55 秒(消息处理器上设置的默认超时期限)后发生。如果您看到错误发生在 55 秒后,则表示超时可能是问题的原因。
    2. 确定错误是否显示故障:messaging.adaptors.http.BadGateway。同样,此错误通常表示发生了超时。
    3. 如果您使用的是 Edge Private Cloud,请注意追踪事件结果中 X-Apigee.Message-ID 字段的值,如下所示。Private Cloud 用户可以使用此 ID 值进一步排查问题,如后文所述。

      1. 点击轨迹路径中的 Analytics Data Recorded 图标:

      2. 向下滚动,并记下名为 X-Apigee.Message-ID 的字段的值。

如需确认 TLS/SSL 握手超时是否是导致此错误的原因,请根据您使用的是公共云还是私有云,按照以下部分中的步骤操作。

仅限 Edge Private Cloud 用户执行的其他诊断步骤

如果您使用的是 Apigee Edge Private Cloud,可以执行以下步骤来帮助验证握手错误的原因。在此步骤中,您将检查消息处理器日志文件以获取相关信息。如果您使用的是 Edge Public Cloud,则可以跳过本部分,直接前往面向私有云和公共云用户的其他诊断步骤

  1. 使用 telnet 命令检查您是否可以从每个消息处理器直接连接到特定的后端服务器:

    1. 如果后端服务器解析为单个 IP 地址,请使用以下命令:

      telnet BackendServer-IPaddress 443
    2. 如果后端服务器解析为多个 IP 地址,请在 telnet 命令中使用后端服务器的主机名,如下所示:

      telnet BackendServer-HostName 443

    如果您能够连接到后端服务器且未出现任何错误,请继续执行下一步。

    如果 telnet 命令失败,您需要与网络团队合作,检查消息处理器与后端服务器之间的连接。

  2. 检查消息处理器日志文件,看看是否有握手失败的证据。打开文件:

    /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 Private Cloud 和 Public Cloud 用户的其他诊断步骤

为了进一步查明问题,您可以使用 tcpdump 工具分析 TCP/IP 数据包,以确认在 TLS/SSL 握手期间是否发生了超时。

  1. 如果您是私有云用户,则可以在后端服务器或消息处理器上捕获 TCP/IP 数据包。最好在后端服务器上捕获这些数据包,因为数据包在后端服务器上解密。
  2. 如果您是公共云用户,则无法访问消息处理器;不过,捕获后端服务器上的 TCP/IP 数据包可能有助于找出问题。
  3. 确定要捕获 TCP/IP 数据包的位置后,使用以下 tcpdump 命令捕获 TCP/IP 数据包。

    tcpdump -i any -s 0 host <IP address> -w <File name>
    
    • 如果您要在后端服务器上获取 TCP/IP 数据包,请在 tcpdump 命令中使用消息处理器的公共 IP 地址。如需有关使用该命令检查后端服务器流量的帮助,请参阅 tcpdump

    • 如果您要在消息处理器上获取 TCP/IP 数据包,请在 tcpdump 命令中使用后端服务器的公共 IP 地址。如需有关使用该命令检查消息处理器流量的帮助,请参阅 tcpdump

    • 如果后端服务器/消息处理器有多个 IP 地址,则需要尝试其他 tcpdump 命令用法。如需详细了解此工具以及此命令的其他变体,请参阅 tcpdump

  4. 使用 Wireshark 工具或类似工具分析 TCP/IP 数据包。以下屏幕截图显示了 Wireshark 中的 TCP/IP 数据包。

  5. 在 Wireshark 输出中,可以看到前 3 个数据包中成功完成了三向 TCP 握手。

  6. 然后,消息处理器在数据包 #4 中发送“Client Hello”消息。

  7. 由于后端服务器没有确认,消息处理器在等待预定义的时间间隔后,在数据包 5、6 和 7 中多次重新传输“Client Hello”消息。

  8. 如果消息处理器在 3 次重试后未收到任何确认,则会向后端服务器发送 FIN、ACK 消息,以表明它正在关闭连接。

  9. 如您在 Wireshark 会话示例中所示,与后端的连接成功(步骤 1),但 SSL 握手超时,因为后端服务器从未响应。

如果您已执行本剧本中的问题排查步骤,并确定超时导致了 TLS/SSL 握手错误,请前往解决方案部分。

使用 API Monitoring 识别问题

借助 API Monitoring,您可以快速找出问题区域,以诊断错误、性能和延迟时间问题及其来源,例如开发者应用、API 代理、后端目标或 API 平台。

逐步完成一个示例场景,该场景演示了如何使用 API 监控功能排查 API 的 5xx 问题。例如,您可能希望设置一个提醒,以便在 messaging.adaptors.http.BadGateway 故障的数量超过特定阈值时收到通知。

分辨率

通常,SSL 握手超时是由于后端服务器上的防火墙限制阻止了来自 Apigee Edge 的流量而导致的。如果您按照诊断步骤操作后确定握手错误的原因是超时,则需要与网络团队联系,以确定原因并修复防火墙限制。

请注意,防火墙限制可能是在不同的网络层级上实施的。请务必确保移除所有网络层中与消息处理器 IP 相关的限制,以确保 Apigee Edge 与后端服务器之间的流量顺畅流动。

如果没有防火墙限制,并且/或者问题仍然存在,请前往必须收集诊断信息

必须收集的诊断信息

如果按照上述说明操作后问题仍然存在,请收集以下诊断信息。联系 Apigee Edge 支持团队并向其提供以下信息:

  1. 如果您是公共云用户,请提供以下信息:
    1. 组织名称
    2. 环境名称
    3. API 代理名称
    4. 用于重现错误的完整 curl 命令
    5. 显示错误的轨迹文件
    6. 在后端服务器上捕获的 TCP/IP 数据包
  2. 如果您是 Private Cloud 用户,请提供以下信息:
    1. 观察到的完整错误消息
    2. API 代理软件包
    3. 显示错误的轨迹文件
    4. 消息处理器日志 /opt/apigee/var/log/edge-message-processor/logs/system.log
    5. 在后端服务器或消息处理器上捕获的 TCP/IP 数据包。
  3. 您尝试过本 Playbook 中的哪些部分,以及有助于我们快速解决此问题的任何其他数据分析。