【问题标题】:Application ELB route traffic to new added instance before grace period应用程序 ELB 在宽限期之前将流量路由到新添加的实例
【发布时间】:2019-06-18 01:55:29
【问题描述】:

我已设置 Auto Scaling 组并将宽限期设置为 300(5 分钟)。我的新实例最多需要 2.5 分钟才能启动并准备好处理 HTTP 请求。但我注意到,每次添加我的新实例时,ELB 甚至在宽限期(即 5 分钟)之前就开始将流量转发到新实例。因此,我面临 502 Bad Gateway 错误。

谁能指导我为什么我的应用程序负载均衡器会这样?

我正在使用 ELB 类型的健康检查,以下是我的目标组健康检查的设置

协议:HTTP

端口:80

健康阈值:2

不健康阈值:10

超时:10

间隔:150

成功码:200

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-elb autoscaling


    【解决方案1】:

    这是正常行为。没有宽限期以防止发生健康检查。这适用于 ELB 和 EC2 服务运行状况检查。在您指定的宽限期内,ELB 和 EC2 服务都会向您的实例发送运行状况检查。这里的区别在于自动缩放不会对这些检查的结果起作用。这意味着自动缩放不会自动安排实例进行替换。

    只有在实例启动并正常运行(通过 ELB 和 EC2 健康检查)后,ELB 才会注册实例并开始向其发送正常流量。但这可能发生在宽限期到期之前。如果您在实例注册到 ELB 后看到 502 错误,那么您的问题出在其他地方。

    【讨论】:

    • 感谢您的详细回答。我已经对其进行了测试,我的实例需要将近 150 秒才能准备好处理 HTTP 请求,并且我还确认,如果通过公共 IP 直接访问新添加的实例,其功能将在 150 秒内起作用,而我面临的 502 错误出现几乎 320 秒。那么,是什么导致了这个错误呢?我还检查了 ELB 日志并确认 ELB 正在生成 502 而后端状态代码为 nil
    • 很难说。您的应用程序是否正常工作?在 ELB 可能有一些小事情会导致这种情况。例如,它可能是由在每个标头之间包含多个 CRLF 的响应或包含非整数的 Content-Length 标头或正文中的字节数多于 Content-Length 标头值的响应引起的。所有这些都可能导致您在 ELB 看到 502 错误。
    • 是的,我的应用程序运行顺利。 ELB 访问日志显示 elb_status_code=502 和 backend_status_code=-
    【解决方案2】:

    终于解决了我的问题。我在这里写我的解决方案是为了帮助这里遇到同样问题的其他人。

    就我而言,我最初的感觉是Application Load Balancer 正在将流量路由到新添加的实例,然后才准备好服务。但详细调查表明这不是问题所在。在我的情况下,新实例能够在启动时提供流量,几分钟后它会在大约 30 秒内生成此 ELB 级别 502 错误,然后开始正常工作。

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

    我将ELB 超时设置为 60 秒,将 Apache2 超时设置为 120 秒。这解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 2014-07-05
      • 2018-10-08
      • 2017-12-29
      • 2012-03-06
      • 1970-01-01
      • 2019-08-10
      相关资源
      最近更新 更多