AWS ELB间歇性502网关超时错误

时间:2019-05-30 01:05:16

标签: amazon-web-services amazon-elb

我在3个EC2实例上部署的node.js应用程序的前面有一个ELB。

我已经开始观察间歇性HTTP 502错误网关错误

以下是我的访问日志的摘录。这些502错误没有任何模式,因此我无法缩小原因范围?

ELB问题还是应用问题?

访问日志可以帮助我解决吗?

每100个请求中就有5个发生

*type*                     https    
*timestamp*                2019-05-08T14:50:11.438405Z  
*elb*                      <my-elb>
*client:port*              clientIp:port
*target:port*              targetIp:port
*request_processing_time*  0    
*target_processing_time*.  2.596    
*response_processing_time* -1   
*elb_status_code*          502  
*target_status_code*       -    
*received_bytes*           792  
*sent_bytes*               293  
*request*                  POST https://app/app-url/2.0/resourcepath/id/abc?queryParamA=abc&queryParamB=false&queryParamC=6b84c34 HTTP/1.1  
*user_agent*               Apache-CXF/3.2.5 
*ssl_cipher*               ssl-cipher
*ssl_protocol*             TLSv1.2  
*target_group_arn*         arn
*trace_id*                 traceId
*domain_name*              cool-domain-name
*chosen_cert_arn*          session-reused   
*matched_rule_priority*    0    
*request_creation_time*    2019-05-08T14:50:08.841000Z  
*actions_executed*         forward  
*redirect_url*             -    
*error_reason*             -

5 个答案:

答案 0 :(得分:6)

确保您的节点服务器keepAliveTimeout大于ELB空闲超时。 ELB和ALB不喜欢目标计算机关闭连接时的情况。要检测到这一点,您可以检查elb日志,您可能会看到响应时间为-1(带502)。“-1”表示目标直接拒绝了请求。

答案 1 :(得分:0)

ELB上的502通常指向应用程序/服务器问题。 ELB与应用服务器通信时出现问题。检查应用日志中是否有重新启动或其他错误。

根据RFC:

  

10.5.3 502错误的网关
  该服务器在充当网关或代理的同时,从尝试访问该请求的上游服务器接收到无效响应。

可能的原因是由于连接断开而导致的标题或响应正文为空或不完整。在应用日志中查找500个服务器错误。

对于您而言,应用服务器崩溃可能会导致ELB上出现502错误。

请参见

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

答案 2 :(得分:0)

这里是一个参考链接,开头为: https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html#http-502-issues

其中最常见的是后端保持活动状态小于ELB,当后端关闭它时,ELB保持连接打开;当ELB使用相同的TCP连接时,它会得到RESET。

答案 3 :(得分:0)

确保在ALB / ELB后面时不使用Apache的事件MPM模块(默认)。它动态关闭连接。尝试工作者MPM。

答案 4 :(得分:0)

检查您的目标群体并确保健康检查工作正常。在我们的例子中,我们有一个损坏的健康检查,将所有节点标记为不健康。我们具有自动缩放功能,因此可以动态地从组中添加/删除节点(取决于当前负载)。

然后 AWS 负载均衡器的这种奇怪行为开始了(来自官方文档 https://docs.aws.amazon.com/elasticloadbalancing/latest/application/elb-ag.pdf):

<块引用>

如果目标组中至少有一个健康的目标,负载均衡器只会将请求路由到健康的目标。如果目标组仅包含运行状况不佳的目标,负载均衡器会将请求路由到运行状况不佳的目标。

由于这种行为,我们没有意识到健康检查被破坏,并且 502 发生的请求被路由到刚刚添加/删除到/从目标组中删除的节点。修复运行状况检查修复了问题。