27

我在 EC2 实例上运行微服务(使用不同的编程语言)。在生产中,当这些服务尝试相互交互时,我注意到一些 502 Bad Gateway Errors。同样在所请求服务的日志中,它没有显示任何 api 调用被命中

示例服务 A 调用服务 B,但在服务 B 日志中没有任何内容表明调用来自服务 A。

可能是 AWS 负载均衡器问题吗?任何帮助,将不胜感激。提前致谢。

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

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

还有什么可能的解决方案?

4

2 回答 2

26

我们遇到了同样的问题。

在我们的设置中,AWS 应用程序 ELB 有一个包含 4 个 EC2 实例的目标组。在每个 EC2 实例上,都有一个 Apache2 转发到 Tomcat。

ELB 的默认连接 KeepAlive 为 60 秒。Apache2 的默认连接 KeepAlive 为 5 秒。如果 5 秒结束,Apache2 将关闭其连接并重置与 ELB 的连接。然而,如果一个请求在正确的时间到达,ELB 将接受它,决定将它转发到哪个主机,并且在那一刻,Apache 关闭连接。这将导致上述 502 错误代码。

解决方案是:当您有级联代理/LB 时,要么调整它们的 KeepAlive 超时,要么 - 最好 - 甚至使它们越长越好。

我们将 ELB 超时设置为 60 秒,将 Apache2 超时设置为 120 秒。问题消失了。

于 2018-05-04T11:56:24.167 回答
0

健康检查使用 HTTP2。http2通过添加监听 80,我让运行 NGINX 的 EC2 实例运行良好。

listen 80 default_server http2;

于 2021-12-04T05:02:01.840 回答