我在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* -
答案 0 :(得分:6)
确保您的节点服务器keepAliveTimeout大于ELB空闲超时。 ELB和ALB不喜欢目标计算机关闭连接时的情况。要检测到这一点,您可以检查elb日志,您可能会看到响应时间为-1(带502)。“-1”表示目标直接拒绝了请求。
答案 1 :(得分:0)
ELB上的502通常指向应用程序/服务器问题。 ELB与应用服务器通信时出现问题。检查应用日志中是否有重新启动或其他错误。
根据RFC:
10.5.3 502错误的网关
该服务器在充当网关或代理的同时,从尝试访问该请求的上游服务器接收到无效响应。
可能的原因是由于连接断开而导致的标题或响应正文为空或不完整。在应用日志中查找500个服务器错误。
对于您而言,应用服务器崩溃可能会导致ELB上出现502错误。
请参见
答案 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 发生的请求被路由到刚刚添加/删除到/从目标组中删除的节点。修复运行状况检查修复了问题。