502 Bad Gateway - 套接字挂起

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

问题

客户端应用会收到 HTTP 状态代码 502 Bad Gateway,其中包含代码 ECONNRESET,作为 Edge Microgateway 中 API 调用的响应。

出错提示

客户端将看到以下响应代码:

HTTP/1.1 502 Bad Gateway

响应将包含以下错误消息:

{"message":"socket hang up","code":"ECONNRESET"}

可能的原因

原因 说明 适用的问题排查说明
错误配置了 keep-alive 超时 Edge Microgateway 和目标服务器之间的 keep-alive 超时配置不正确。 Edge Public 和 Private Cloud 用户
目标服务器过早关闭连接 在 Edge Microgateway 发送请求载荷时,目标服务器过早关闭连接。 Edge Public 和 Private Cloud 用户

常见诊断步骤

  1. 检查 Edge Microgateway 日志:
    /var/tmp/edgemicro-`hostname`-*.log
  2. 搜索以查看在特定时长内(如果问题发生在过去)是否存在任何代码为 ECONNRESET502 错误,或者是否存在任何仍因 502 而失败的请求。
    2021-06-23T03:52:24.110Z [error][0:8000][3][myorg][test]
    [emg_badtarget/flakey/hangup][][][6b089a00-d3d6-11eb-95aa-911f1ee6c684]
    [microgateway-core][][GET][502][socket hang up][ECONNRESET][]
  3. 如果您将日志记录级别设置为 warninfo,则第二个元素中还会包含 [warn] 消息,其中包含目标服务器主机名和端口。在此示例中,它是 X.X.X.X:8080,稍后可用于捕获 tcpdump
    2021-06-23T03:52:24.109Z
    [warn][X.X.X.X:8080][3][myorg][test][emg_badtarget/flakey/hangup]
    [][][6b089a00-d3d6-11eb-95aa-911f1ee6c684][plugins-middleware]
    [targetRequest error][GET][][socket hang up][ECONNRESET][395]
  4. 错误代码 [socket hang up][ECONNRESET] 表示目标服务器已关闭与 Edge Microgateway 的连接。您可以在日志中搜索此信息,以确定该问题发生的频率。

原因:keep-alive 超时配置不正确

诊断

  1. 按照常见诊断步骤中的步骤操作,并验证是否出现 [socket hang up][ECONNRESET] 错误。
  2. 如果为“是”,请按照下文所述,借助 tcpdump 进一步调查:

使用 tcpdump

  1. 在 Edge Microgateway 主机操作系统上,使用以下命令捕获 Edge Microgateway 与后端服务器之间的 tcpdump
    tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
    
  2. 分析捕获的 tcpdump

    tcpdump 输出示例: ( 查看放大图片

    在上述示例 tcpdump 中,您可以看到以下内容:

    1. 在数据包 250288 中,客户端发送 POST 请求。
    2. 在数据包 250371 中,服务器以 200 OK 进行响应。
    3. 在数据包 250559 中,客户端发送了 ACK.
    4. 在数据包 250560 中,服务器发送 Continuation 消息。
    5. 在数据包 250561 中,客户端发送 ACK.
    6. 在数据包 262436 中,服务器向客户端发送 FIN, ACK,以启动连接关闭。请注意,这大约是在上一个数据包 (250561) 之后五秒。
    7. 在数据包 262441 中,客户端发送了另一个 POST 请求。不过,由于服务器已启动连接关闭,因此该操作会失败。它在数据包 262441 中以 RST 进行响应。

    在此示例中,同一连接至少成功重用了 1 次,但在最终请求中,服务器在空闲 5 秒后启动连接关闭,而这恰好是客户端发送新请求的时间。这表明后端服务器的 keep-alive 超时时间很可能小于或等于客户端中设置的值。如需验证这一点,请参阅比较 Edge Microgateway 和后端服务器上的 keep-alive 超时

比较 keep-alive 超时

  1. Edge Microgateway 没有特定的 keep-alive 超时属性。它由运行它的操作系统决定。常见示例包括 Windows、Linux 和 Docker 容器。
  2. 这可能是在操作系统中自定义的。请与您的系统管理员联系。默认情况下,Linux 操作系统的默认 keep-alive 超时时间为两小时。
  3. 接下来,检查后端服务器上配置的 keep-alive 超时属性。假设您的后端服务器配置的值为 10 秒。
  4. 如果您确定操作系统上的 keep-alive 超时值高于后端服务器上的 keep-alive 超时属性值(如上例所示),则这是导致 502 错误的原因。

分辨率

确保运行 Edge Microgateway 的操作系统上的 keep-alive 超时属性始终低于后端服务器上的相应属性。

  1. 确定后端服务器上为 keep-alive 超时设置的值。
  2. 在操作系统中为 keep-alive 超时属性配置适当的值,使 keep-alive 超时属性低于后端服务器上设置的值,具体步骤取决于您的操作系统。

最佳做法

强烈建议下游组件的 keep-alive 超时阈值始终低于上游服务器上配置的阈值,以避免此类竞态条件和 502 错误。每个下游跃点的延迟都应低于每个上游跃点的延迟。在 Edge Microgateway 中,建议遵循以下准则:

  1. 客户端应用或负载平衡器上的 keep-alive 超时应小于 Edge Microgateway keep-alive 超时。

    如需在 Edge Microgateway 上配置 keep-alive 超时,请将 keep_alive_timeout 值添加到 ~/.edgemicro/org-env-config.yaml 文件中。

    edgemicro:
      keep_alive_timeout: 65000
  2. Edge Microgateway 操作系统 keep-alive 超时应小于目标服务器 keep-alive 超时。
  3. 如果您在 Edge Microgateway 前面或后面有任何其他跃点,则应应用相同的规则。您应始终将关闭与上游的连接的责任留给下游客户端。

原因:目标服务器过早关闭连接

诊断

  1. 按照常见诊断步骤中的说明操作,验证您是否收到 [socket hang up][ECONNRESET] 错误。
  2. 如果存在,请按照下文所述,借助 tcpdump 进一步调查。

    上述示例中的错误消息 [targetRequest error][GET][][socket hang up][ECONNRESET] 表明,Edge Microgateway 在向后端(目标)服务器发送请求时发生了此错误。也就是说,Edge Microgateway 已将 API 请求发送到后端服务器,并正在等待响应。不过,在 Edge Microgateway 收到响应之前,后端服务器突然终止了连接。

  3. 检查后端服务器日志,看看是否有任何错误或信息可能导致后端服务器突然终止连接。如果您发现任何错误或信息,请前往解决方案,并在后端服务器中相应地解决问题。
  4. 如果您在后端服务器中未发现任何错误或信息,请在 Edge Microgateway 服务器上收集 tcpdump 输出:
    tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
    
  5. 分析 tcpdump 捕获的内容:

    tcpdump 输出示例: ( 查看放大图片

    在上述示例 tcpdump 中,您可以看到以下内容:

    1. 在数据包 4 中,Edge Microgateway 向目标服务器发送了 GET 请求。
    2. 在数据包 5 中,目标服务器以 ACK 进行响应,以确认请求。
    3. 不过,在数据包 6 中,目标服务器不是发送响应载荷,而是发送 FIN, ACK 来启动连接关闭。
    4. 在数据包 7 及后续数据包中,连接是相互关闭的。由于连接在发送响应之前已关闭,Edge Microgateway 会向客户端返回 HTTP 502 错误。
    5. 请注意,数据包 8 的时间戳 2021-06-23T03:52:24.110Z 与 Edge Microgateway 日志中记录错误的时间戳相对应。日志文件和 tcpdump 中的时间戳通常可用于将错误与实际数据包相关联。

    分辨率

    在后端服务器上妥善修复相应问题。

    如果问题仍然存在,并且您需要帮助来排查 502 Bad Gateway Error 问题,或者您怀疑问题出在 Edge Microgateway 中,请前往必须收集诊断信息

    必须收集的诊断信息

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

    • 日志文件:默认文件夹为 /var/tmp,但可以在主 config.yaml 文件 (logging > dir parameter) 中替换该文件夹。建议在向 Apigee 支持团队提供日志文件之前,将 log > level 更改为 info
    • 配置文件:Edge Microgateway 的主要配置位于默认 Edge Microgateway 文件夹 $HOME/.edgemicro 中的 YAML 文件中。有一个名为 default.yaml 的默认配置文件,然后每个环境都有一个配置文件 ORG-ENV-config.yaml。请完整上传此文件,以便我们了解受影响的组织和环境。