我已经设置了"自动缩放"组,并将宽限期设置为300(5分钟)。我的新实例最多需要2.5分钟才能启动并准备好处理HTTP请求。但我注意到,每次添加我的新实例时,ELB甚至在宽限期(即5分钟)之前就开始向新实例转发流量。因此,我面临502坏网关错误。
有人能告诉我为什么我的应用程序负载均衡器会这样做吗?
我正在使用ELB类型的健康检查,下面是我的目标群体健康检查的设置
协议:HTTP
端口:80
健康阈值:2
不健康阈值:10
超时:10
间隔:150
成功代码:200
这是一种正常行为。宽限期并不是为了防止健康检查的发生。这对于ELB和EC2服务运行状况检查都适用。在您指定的宽限期内,ELB和EC2服务都将向您的实例发送健康检查。这里的区别在于,自动缩放不会对这些检查的结果起作用。这意味着自动缩放不会自动安排替换实例。
只有在实例正确启动并运行(通过ELB和EC2健康检查)后,ELB才会注册实例并开始向其发送正常流量。但这可能在宽限期到期之前发生。如果您在向ELB注册实例后看到502错误,那么您的问题就在其他地方。
最后我解决了我的问题。我在这里写我的解决方案是为了帮助其他面临同样问题的人。
在我的案例中,我最初的感觉是Application Load Balancer
在准备好服务之前就将流量路由到新添加的实例。但详细的调查表明,这不是问题所在。在我的案例中,新实例能够在开始时提供流量,几分钟后,它生成了这个ELB
级别502的错误,持续了大约30秒,之后它开始正常工作。
解决方案:应用程序的默认连接KeepAlive
为60秒。Apache2的默认连接KeepAlive
为5秒。如果5秒钟结束,Apache2将关闭其连接并重置与ELB
的连接。然而,如果请求正好在正确的时间到来,ELB
将接受它,决定将它转发到哪个主机,然后Apache关闭连接。这将导致所述502错误代码。
我将ELB
超时设置为60秒,将Apache2超时设置为120秒。这解决了我的问题。