繁体   English   中英

AWS 负载均衡器 502 错误网关

[英]AWS Load Balancer 502 Bad Gateway

我有用应用程序负载均衡器托管在 EC2 上的 node/express 编写的微服务。

一些用户甚至在请求到达服务器之前就收到了 502。

我在每个实例中注册每个日志,我没有这些请求的日志,我在 502 之前有请求,在 502 之后有请求,这就是为什么我假设请求永远不会到达服务器的原因。 大多数用户通过刷新页面或使用匿名选项卡来解决这个问题,这会连接到不同的机器(我们有 6 个)。

我可以从负载均衡器日志中看出,负载均衡器几乎立即以 502 响应请求。我猜这可能是 TCP RST。

很久以前也遇到过类似的问题,不得不在节点配置中加入keepAliveTimeoutheadersTimeout 这是我的设置(仍然使用 60 年代的 LB 默认值):

server.keepAliveTimeout = 65000;
server.headersTimeout = 80000;

所有实例的指标,尤其是 memory 和 CPU 使用率都很好。

这些 502 错误是在我们进行更新后开始的,我们在其中引入了几个包,例如 axios。 一开始我以为可能是axios,因为默认没有开启keep-alive。 但它没有用。 除了axios 之外,我们只使用请求

关于我应该如何调试/修复此问题的任何提示?

HTTP 502 错误通常是由负载平衡器的问题引起的。 这可以解释为什么请求永远不会到达您的服务器,大概是因为负载均衡器由于某种或其他原因无法到达服务器。

这个链接有一些关于如何从经典负载均衡器获取日志的提示。 但是,由于您没有指定,您可能正在使用应用程序负载均衡器,在这种情况下, 此链接可能更有用。

从 ALB 访问日志中,我知道 ALB 无法连接目标,或者连接正在被目标立即终止。

最困难的部分是弄清楚如何复制 502 错误。

看起来我使用的节点版本的请求标头大小限制为 8kb。 如果任何请求超过该限制,目标将拒绝连接,并且 ALB 将返回 502 错误。

解决方案:

我通过在节点启动命令行中添加--max-http-header-size=size解决了这个问题,其中 size 是一个大于 8kb 的值。

AWS 负载均衡器 502 错误网关的几个常见原因:

  1. 确保将您的公有子网(您的 ALB 的目标)设置为自动分配公有 IP(以便为部署的实例自动分配公有 IP)。
  2. 您的 alb 的安全组允许来自您连接的 IP 的 http 和/或 https 流量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM