您正在查看 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 用户 |
常见诊断步骤
- 检查 Edge Microgateway 日志:
/var/tmp/edgemicro-`hostname`-*.log
- 搜索以查看在特定时长内(如果问题发生在过去)是否存在任何代码为
ECONNRESET的502错误,或者是否存在任何仍因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][]
- 如果您将日志记录级别设置为
warn或info,则第二个元素中还会包含[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]
- 错误代码
[socket hang up][ECONNRESET]表示目标服务器已关闭与 Edge Microgateway 的连接。您可以在日志中搜索此信息,以确定该问题发生的频率。
原因:keep-alive 超时配置不正确
诊断
使用 tcpdump
- 在 Edge Microgateway 主机操作系统上,使用以下命令捕获 Edge Microgateway 与后端服务器之间的
tcpdump:tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- 分析捕获的
tcpdump:tcpdump 输出示例: ( 查看放大图片)
在上述示例
tcpdump中,您可以看到以下内容:- 在数据包 250288 中,客户端发送
POST请求。 - 在数据包 250371 中,服务器以
200 OK进行响应。 - 在数据包 250559 中,客户端发送了
ACK. - 在数据包 250560 中,服务器发送
Continuation消息。 - 在数据包 250561 中,客户端发送
ACK. - 在数据包 262436 中,服务器向客户端发送
FIN, ACK,以启动连接关闭。请注意,这大约是在上一个数据包 (250561) 之后五秒。 - 在数据包 262441 中,客户端发送了另一个
POST请求。不过,由于服务器已启动连接关闭,因此该操作会失败。它在数据包 262441 中以RST进行响应。
在此示例中,同一连接至少成功重用了 1 次,但在最终请求中,服务器在空闲 5 秒后启动连接关闭,而这恰好是客户端发送新请求的时间。这表明后端服务器的 keep-alive 超时时间很可能小于或等于客户端中设置的值。如需验证这一点,请参阅比较 Edge Microgateway 和后端服务器上的 keep-alive 超时。
- 在数据包 250288 中,客户端发送
比较 keep-alive 超时
- Edge Microgateway 没有特定的 keep-alive 超时属性。它由运行它的操作系统决定。常见示例包括 Windows、Linux 和 Docker 容器。
- 这可能是在操作系统中自定义的。请与您的系统管理员联系。默认情况下,Linux 操作系统的默认 keep-alive 超时时间为两小时。
- 接下来,检查后端服务器上配置的 keep-alive 超时属性。假设您的后端服务器配置的值为 10 秒。
- 如果您确定操作系统上的 keep-alive 超时值高于后端服务器上的 keep-alive 超时属性值(如上例所示),则这是导致
502错误的原因。
分辨率
确保运行 Edge Microgateway 的操作系统上的 keep-alive 超时属性始终低于后端服务器上的相应属性。
- 确定后端服务器上为 keep-alive 超时设置的值。
- 在操作系统中为 keep-alive 超时属性配置适当的值,使 keep-alive 超时属性低于后端服务器上设置的值,具体步骤取决于您的操作系统。
最佳做法
强烈建议下游组件的 keep-alive 超时阈值始终低于上游服务器上配置的阈值,以避免此类竞态条件和 502 错误。每个下游跃点的延迟都应低于每个上游跃点的延迟。在 Edge Microgateway 中,建议遵循以下准则:
客户端应用或负载平衡器上的 keep-alive 超时应小于 Edge Microgateway keep-alive 超时。
如需在 Edge Microgateway 上配置 keep-alive 超时,请将
keep_alive_timeout值添加到~/.edgemicro/org-env-config.yaml文件中。edgemicro: keep_alive_timeout: 65000
- Edge Microgateway 操作系统 keep-alive 超时应小于目标服务器 keep-alive 超时。
- 如果您在 Edge Microgateway 前面或后面有任何其他跃点,则应应用相同的规则。您应始终将关闭与上游的连接的责任留给下游客户端。
原因:目标服务器过早关闭连接
诊断
- 按照常见诊断步骤中的说明操作,验证您是否收到
[socket hang up][ECONNRESET]错误。 - 如果存在,请按照下文所述,借助
tcpdump进一步调查。上述示例中的错误消息
[targetRequest error][GET][][socket hang up][ECONNRESET]表明,Edge Microgateway 在向后端(目标)服务器发送请求时发生了此错误。也就是说,Edge Microgateway 已将 API 请求发送到后端服务器,并正在等待响应。不过,在 Edge Microgateway 收到响应之前,后端服务器突然终止了连接。 - 检查后端服务器日志,看看是否有任何错误或信息可能导致后端服务器突然终止连接。如果您发现任何错误或信息,请前往解决方案,并在后端服务器中相应地解决问题。
- 如果您在后端服务器中未发现任何错误或信息,请在 Edge Microgateway 服务器上收集
tcpdump输出:tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- 分析
tcpdump捕获的内容:tcpdump 输出示例: ( 查看放大图片)
在上述示例
tcpdump中,您可以看到以下内容:- 在数据包 4 中,Edge Microgateway 向目标服务器发送了
GET请求。 - 在数据包 5 中,目标服务器以
ACK进行响应,以确认请求。 - 不过,在数据包 6 中,目标服务器不是发送响应载荷,而是发送
FIN, ACK来启动连接关闭。 - 在数据包 7 及后续数据包中,连接是相互关闭的。由于连接在发送响应之前已关闭,Edge Microgateway 会向客户端返回 HTTP
502错误。 - 请注意,数据包 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。请完整上传此文件,以便我们了解受影响的组织和环境。
- 在数据包 4 中,Edge Microgateway 向目标服务器发送了