AWS Elastic Beanstalk 为负载均衡环境中的大多数请求返回 502(日志中为 499)

AWS Elastic Beanstalk returning 502 (499 in logs) for most of the requests in load balanced environment

我对 AWS Elastic Beanstalk 的简单性印象深刻,并创建了多个环境来部署我的 express.js APIs。我已经将 Classic Load Balancer 与使用端口 80 & 443 的传入请求一起使用,并将它们 inbound 重定向到 EC2 实例上的 80 以供 NGINX 处理。

但是当尝试使用浏览器或其他带有 Axios、request-promise 等库的控制台应用程序时,API 没有响应并在一分钟后点击 502 error。这很奇怪,因为 API 几乎在 1 或 2 秒的时间内立即发送响应。

When I hit the APIs from the Postman console, the responses are fine. There should be some issue with NGINX, ELB and the client. The express.js application is running totally fine without any errors.

我想调试并从 AWS 控制台获取日志,以查看包含大量 499 errors 的 NGINX 日志,这是导致此问题的原因。此外,有些请求甚至不会从负载均衡器转到 NGINX。

我想要解决此问题的解决方案。此外,proxy_ignore_client_abort 是我在多个场合发现的一种建议方式。但是,我对如何以 .ebextensions 方式使用它一无所知。如果有答案,这将有助于解决问题。

解决此问题的方法是遵循以下步骤:

  1. 使用基于单个实例的 EB 堆栈或更喜欢应用程序负载均衡器而不是经典负载均衡器,因为 CLB 出于未知原因间歇性地终止了与 EB 的连接。

  2. 添加自定义发布的 SSL(可以是 Let's Encrypt),以防它是通过 .ebextensions 将 SSL 密钥复制到 EB 的单个实例配置。如果它是基于 ALB 的,您可以使用 AWS 的 ACM 自动配置证书。

  3. 现在,将按照应用程序负载均衡器/单实例的 AWS EB 堆栈文档中的说明添加 SSL 配置。

  4. 现在应用程序将 运行 由于负载平衡器而没有任何 499 错误。