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