502 Bad Gateway - 套接字挂起

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

问题

客户端应用收到 HTTP 状态代码 502 Bad Gateway 和代码 ECONNRESET,作为 Edge Microgate 中 API 调用的响应。

错误消息

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

HTTP/1.1 502 Bad Gateway

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

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

可能的原因

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

常见诊断步骤

  1. 检查 Edge Microgate 日志:
    /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 Microgate 的连接。您可以在日志中搜索相关信息,以确定发生这种情况的频率。

原因:keep-alive 超时配置错误

诊断

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

使用 tcpdump

  1. 使用以下命令在 Edge Microgate 主机操作系统上捕获 Edge Microgate 与后端服务器之间的 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) 晚 5 秒。
    7. 在数据包 262441 中,客户端发送另一个 POST 请求。但是,此过程会失败,因为服务器已发起连接关闭操作。它在数据包 262441 中返回 RST

    此示例中至少成功重复使用了一次连接,但在发送最终请求时,服务器会在空闲时间达到 5 秒后发起连接关闭,这与客户端发送新请求的同时发生。这表明后端服务器 keep-alive 超时很可能更短或等于客户端中设置的值。如需验证这一点,请参阅比较 Edge Microgate 和后端服务器上的 keep-alive 超时

比较 keep-alive 超时

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

分辨率

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

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

最佳做法

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

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

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

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

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

诊断

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

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

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

    tcpdump 输出示例:( 查看大图

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

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

    分辨率

    妥善修复后端服务器上的问题。

    如果问题仍然存在,您需要有关排查 502 Bad Gateway Error 问题的帮助,或您怀疑这是 Edge Microgate 的问题所在,请参阅必须收集诊断信息

    必须收集的诊断信息

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

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