502 网关超时错误

您正在查看 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 工具对问题进行初步诊断。

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

    1. 确定是否在 55 秒(消息处理器上设置的默认超时期限)后发生 502 Bad Gateway 错误。如果您发现错误是在 55 秒后发生的,则表示超时可能是问题的原因。
    2. 确定错误是否显示了故障:messaging.adaptors.http.BadGateway。再次强调,此错误通常表示发生了超时。
    3. 如果您使用的是 Edge Private Cloud,请记下轨迹输出中的 X-Apigee.Message-ID 字段的值,如下所示。私有云用户可以使用此 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 私有云和公有云用户的进一步诊断步骤

如需进一步查明问题,您可以使用 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 输出中,三向 TCP 握手在前 3 个数据包中成功完成。

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

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

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

  9. 如 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 支持团队联系并向其提供相关信息:

  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. 详细说明您已尝试本手册中的哪些部分,以及任何其他有助于我们快速解决此问题的分析洞见。