AWS负载均衡器502 Bad Gateway

9

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

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

我在每个实例中注册每个日志,但是我没有这些请求的日志,我只有502之前和502之后的请求,因此我认为请求从未到达服务器。大多数用户通过刷新页面或使用匿名标签解决此问题,这会将连接转到另一台机器(我们有6台)。

我可以从负载均衡器日志中得知,负载均衡器几乎立即对请求进行502响应。我猜测这可能是TCP RST。

很久以前,我遇到过类似的问题,当时我不得不将keepAliveTimeoutheadersTimeout添加到节点配置中。以下是我的设置(仍然使用LB默认的60秒):

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

所有实例的指标,特别是内存和CPU使用情况都很好。

这些502错误是在我们引入一些包(例如axios)的更新之后开始出现的。起初,我认为可能是axios的问题,因为默认情况下没有启用keep-alive。但它没有起作用。除了axios外,我们只使用request

您有什么提示可以帮助我调试/解决此问题吗?


1
你如何知道502在请求到达服务器之前发生了?对于你如何进行检查的一些见解可能会更有启发性。 - Arlen Anderson
通过我在每个实例内部的日志,我可以看到在502之前立即成功的上一个请求的日志,以及502之后的请求,但无法看到导致502的请求。幸运的是,我的同事遇到了502错误,我得以在他的帮助下进行调试,并且我知道确切的请求和时间。 - soltex
我已经增加了该目标组的健康检查超时时间,以便减少不健康实例的数量(很可能与某些502错误有关),但是没有任何运气,我仍然有相同数量的不健康实例和502错误。 - soltex
你能提供一些关于你的设置的信息吗?你确定你的实例在你启用负载均衡器的可用区内吗?还有,你使用的是哪种负载均衡器?应用负载均衡器(ALB)吗? - Marcin
我认为负载均衡器一切正常,是应用负载均衡器(ALB)。我可以提供您所需的所有细节。 - soltex
4个回答

6

HTTP 502错误通常由负载均衡器出现问题引起。这可能是因为负载均衡器由于某种原因无法连接到服务器,导致请求从未到达您的服务器。

此链接提供了一些提示,可以了解如何从经典负载均衡器获取日志。但是,由于您没有指定使用的是应用程序负载均衡器,因此此链接可能更有用。


1
我发现网络实例在终止之前有一个巨大的CPU使用峰值,但我不知道是什么原因导致的。 - soltex
我不确定在没有更多信息的情况下我们能否帮助您。问题是,如果您不知道问题可能出在哪里,那么确定我们需要哪些信息也很困难。您是否查看了所有nginx等的错误日志? - stijndepestel
正如我所说,问题可能在目标关闭连接方面,我将尝试通过使用数据包捕获来确认这一点。而且我没有使用nginx。如果您需要任何其他信息,请告诉我。 - soltex
@soltex问题解决了吗?因为我也面临同样的问题,并设置了keepAiveTimeout。 - HafizMuhammad Shoaib
@HafizMuhammadShoaib 是的,我已经解决了这个问题。请查看下面的答案: https://dev59.com/BMHqa4cB1Zd3GeqP5rib#68927075 - soltex
显示剩余2条评论

1

从ALB访问日志中,我知道要么ALB无法连接目标,要么连接被目标立即终止。

而最困难的部分是找出如何复制502错误。

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

解决方案:

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


1
我也遇到了类似的问题,大约持续了1到2个月左右,但是一直没有找到解决方案。我还购买了AWS Premium支持,但他们也无法找到解决方案。我每天随机会出现10次左右502错误。最后,在阅读AWS文档后,我发现:

目标接收请求并开始处理它,但关闭与负载均衡器的连接太早。这通常发生在目标的保持活动超时持续时间短于负载均衡器的空闲超时值时。

https://aws.amazon.com/premiumsupport/knowledge-center/elb-alb-troubleshoot-502-errors/

解决方案:

我在EC2上运行“Apache” Web服务器,所以将“KEEPALIVETIMEOUT=65”增加。这对我起作用了。


-2

AWS负载均衡器出现502 Bad Gateway的几个常见原因:

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

这并没有完全解决我的问题,但它产生了巨大的影响。 - arthurakay
1
这些502错误的原因是什么,请澄清一下?小心建议将公共IP地址分配给您的实例 - 通常它们被隐藏在ALB后面,并且有其私有性质。这样做会将您的实例暴露在互联网上。 - advance512
这并没有回答“为什么”的问题,它反而建议进行更改以影响系统架构和系统安全。 - 4hbane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接