【问题标题】:GCP Load Balancer: 502 Server Error, "failed_to_connect_to_backend"GCP 负载均衡器:502 服务器错误,“failed_to_connect_to_backend”
【发布时间】:2018-12-30 16:15:41
【问题描述】:
我有一个在两个 GCP 实例上运行的 dockerized Go 应用程序,将它们与各自的外部 IP 一起使用时一切正常,但是当通过负载均衡器时,它们要么响应缓慢,要么响应 502 服务器错误。健康检查好像没问题,所以我真的不明白。
在日志中,抛出的错误是
failed_to_connect_to_backend
我已经看到了关于这个问题的其他答案,但似乎没有一个可以为我的案例提供答案。我无法修改应用程序的服务方式,所以它似乎不是超时的事情。
【问题讨论】:
标签:
docker
go
google-cloud-platform
load-balancing
google-kubernetes-engine
【解决方案1】:
解决由于“failed_to_connect_to_backend”引起的负载均衡器的 502 响应。我会检查以下内容:
1) 通常,“failed_to_connect_to_backend”错误消息表明负载均衡器无法连接到后端,调查 URL 映射规则也是一个很好的起点。我还建议检查您的负载均衡器的 URL 映射,以确保正确定义主机规则、路径匹配器和路径规则并符合 this article 中的描述。
2) 还要检查后端实例是否正在耗尽它们的资源,如果后端服务器不堪重负,它将拒绝传入的请求,可能导致负载均衡器放弃它并返回您遇到的特定 502 错误。对于 Apache,您可以使用 this link 和 nginx this link。此外,使用 'netstat' 和 watch command 检查任何时候存在多少已建立连接的输出。
3) 我还建议使用直接对实例的 HTTP(S) 请求再次测试,请求与报告 502 相同的 URL。您可以在 VPC 网络中的另一个 VM 实例中执行此测试。
【解决方案3】:
这不止一次发生在我身上,我在我的服务器中使用 apache,问题不是 CPU 问题,而是配置问题,
我将 apache mpm_event 与 php-fpm 结合使用,并且有许多设置会限制您希望 apache 和 fpm 允许的最大请求数。
在我的例子中,我将 Apache MPM 配置 MaxRequestWorkers 从默认的 150 增加到 600,在 PHP FPM 配置中将 pm.max_children 增加到 80(我不记得这里的默认值是什么)
这按预期工作,希望这有助于您推断自己的堆栈。
【解决方案4】:
我自己在访问在我的 GKE 标准集群上运行的 Prometheus pod 时遇到了 502 错误(通过 IAP 公开)。
问题是配置的外部 HTTP/S 负载均衡器的运行状况检查返回不正常。尽管 Prometheus pod 按预期运行。在深入研究问题后,我发现 GCP 自动生成的健康检查有问题,它检查的是 URL / 而不是 /-/ready。当我删除 Prometheus k8s Ingress 资源(它会自动生成 GCP LB 和运行状况检查)并重新创建它时 - 问题得到了解决(经过几分钟的资源传播)。