AWS负载均衡器502错误

28

我在一台EC2实例上运行了微服务(使用不同的编程语言)。在生产环境中,当这些服务尝试相互交互时,我发现了一些502坏网关错误。同时,在被请求的服务日志中,并没有显示有任何api调用被命中的记录。

例如,服务A调用服务B,但在服务B的日志中并没有任何指示调用来自服务A的记录。

这可能是AWS负载均衡器的问题吗?非常感谢您的帮助。

已尝试解决方案: 我们尝试在每个服务中制作了http/https连接代理,但仍然遇到此问题。

更新: 在lb日志中,api被记录了下来,但目标响应代码显示“-”,而lb响应代码则显示502或504。这是否意味着lb无法处理流量还是我的应用程序出了问题?

另外,有什么可能的解决方案吗?


3
如果流量以正确的方式通过,则可以启用负载均衡器日志,您将能够在此处查看输出或发布日志。 - Kush Vyas
1
在lb日志中,记录了api,但目标响应代码显示“-”,而lb响应代码显示502或504。 这是否意味着lb无法处理流量或我的应用程序?@KushVyas - rajat12a
@Root 我们有完全相同的问题。你现在还有这个问题吗,或者你找到了解决方案? - Jan Dörrenhaus
@JanDoerrenhaus 是的,我们已经找到了解决方案。 - rajat12a
我们遇到了完全相同的问题。 - Cade Embery
@CadeEmbery 你尝试过清空实例吗? - rajat12a
2个回答

28
我们遇到了相同的问题。
我们的设置是,一个AWS应用ELB有4个EC2实例的目标组。在每台EC2实例上,都有一个将流量转发到Tomcat的Apache2。
ELB的默认连接KeepAlive时间为60秒。Apache2的默认连接KeepAlive时间为5秒。如果5秒钟结束,Apache2会关闭连接并重置与ELB的连接。但是,如果恰好在某个时候收到请求,ELB将接受它,决定将其转发给哪个主机,在那一刻,Apache会关闭连接。这将导致502错误代码。
解决方案是:当您具有级联代理/负载平衡器时,请使其KeepAlive超时一致,或者最好让它们随着线路的深入而稍微延长时间。
我们将ELB超时设置为60秒,将Apache2超时设置为120秒。问题得以解决。

2
我们找到了系统的问题,原因是EC2实例立即关闭,而不是等待排空期。我们已经将ELB设置为60秒,Apache设置为120秒。 - rajat12a
我们目前遇到了同样的问题,当出现这种情况时,我们能在 Apache 端看到任何日志吗? - Naga
@Naga 我们没有发现问题,因为Apache没有注意到任何错误。ELB访问日志显示请求的状态码为502,而Apache访问日志则没有显示任何内容。 - Jan Dörrenhaus
3
这个问题真的很难搞明白,感谢这个问答。当我增加KeepAliveTimeout时,问题就得到了解决。 - aknosis
显然,如果你在“接收端”(应用服务器)进行数据包捕获,你可能能够看到响应的 FIN,ACK 数据包和新请求的 SYN 数据包在大多数情况下交叉,但很难捕捉到。 - rogerdpack
显示剩余2条评论

1

健康检查使用HTTP2。我通过在listen 80中添加http2,使我的EC2实例运行NGINX保持健康。

listen 80 default_server http2;


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