502 Bad Gateway - 套接字挂起

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

<ph type="x-smartling-placeholder">

问题

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

错误消息

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

HTTP/1.1 502 Bad Gateway

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

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

可能的原因

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

常见诊断步骤

  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 的连接。您可以在日志中搜索 其发生频率。

原因:保持连接超时配置不正确

<ph type="x-smartling-placeholder">

诊断

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

使用 tcpdump

  1. 捕获 Edge Microgateway 和 上的后端服务器之间的 tcpdump 使用以下命令连接到 Edge Microgateway 主机操作系统:
    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 请求。但是,此操作失败,因为服务器已经启动了关闭 连接。它会在数据包中返回 RST 262441

    在本例中,同一连接至少成功重复使用了 1 次,但 服务器将在五秒后关闭连接 空闲时间,该时间恰好与客户端发送新请求的时间相同。这个 表明后端服务器 keep-alive 超时很有可能短于或等于 客户端中设置的值如需验证这一点,请参阅 比较 Edge Microgateway 和后端服务器上的 keep-alive 超时

比较 keep-alive 超时

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

分辨率

在 Edge 所在的操作系统上,确保 keep-alive 超时属性始终较低 与后端服务器上的相比,Microgateway 正在运行。

  1. 确定为后端服务器上的 keep-alive 超时设置的值。
  2. 在操作 系统进行监控,以使 keep-alive 超时属性低于后端设置的值 执行适用于您操作系统的步骤。

最佳做法

强烈建议下游组件始终具有较短的 keep-alive 超时值 高于上游服务器上配置的阈值,以避免这些类型的竞态条件和 502 个错误。每个下游跃点应低于每个上游跃点。边缘 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
    
    <ph type="x-smartling-placeholder">
  2. Edge Microgateway 操作系统 keep-alive 超时应小于目标 服务器 keep-alive 超时
  3. 如果 Edge Microgateway 之前或之后有任何其他跃点,则同一规则应 。您应始终让下游客户端关闭 与上游的连接
。 <ph type="x-smartling-placeholder">

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

<ph type="x-smartling-placeholder">

诊断

  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) 中。时间是 建议先将 log > level 更改为 info,然后再提供 并将日志文件发送给 Apigee 支持团队。
    • 配置文件:Edge Microgateway 的主要配置位于 YAML 文件位于默认的 Edge Microgateway 文件夹 $HOME/.edgemicro 中。这里有 名为 default.yaml 的默认配置文件,然后为每个环境分别创建一个配置文件 ORG-ENV-config.yaml。请上传此文件 受影响的组织和环境。