【问题标题】:GCP load balancer instance becomens unhealthy after short period of timeGCP 负载均衡器实例在短时间内变得不健康
【发布时间】:2017-12-09 02:37:39
【问题描述】:

我已将在 GCP 上运行的 linux apache 网络服务器放在 google 负载平衡器后面。因为我只想要 https 流量,所以我将端口 80 重定向到 443,如下所示:

<VirtualHost *:80>
  ServerName  spawnparty.com
  ServerAlias www.spawnparty.com
  DocumentRoot /var/www/html/wwwroot
  Redirect permanent / https://www.spawnparty.com
</VirtualHost>

我已经给虚拟机一个外部 IP 地址来测试重定向是否有效。

然后我配置了负载平衡器。我已经做到了,这样 frondend 接受 http 和 https。对于后端,我做了 2 项服务:

一个使用http,一个使用https,这样如果somoeone通过http进入,它会被转发,然后通过上面显示的代码重定向到https。

对两个后端服务进行基本的健康检查:

对于http:端口:80,超时:5s,检查间隔:5s,不健康 阈值:2 次尝试

对于https:端口:443,超时:5s,检查间隔:5s,不健康 阈值:2 次尝试

https 工作正常,1 个实例中的 1 个状态健康,但 http 健康检查状态 1 个实例中的 0 个健康

如果将健康检查从 http 更改为 https 并再次返回 http 后端服务,它会在短时间内工作,但几分钟后它会再次显示 1 个实例中的 0 个是健康的。

我必须改变什么才能保持健康?

【问题讨论】:

  • 我有根据的猜测是,HTTP 的重定向不是负载均衡器健康检查器所期望的。为什么不只需要 HTTPS 健康检查,因为您的 HTTP 配置直接依赖于 HTTPS?
  • 如果由我来决定,我根本不会使用健康检查,但如果没有健康检查,我将无法创建负载均衡器。每个后端服务都需要进行健康检查。由于此后端服务正在侦听 http,因此运行状况检查也需要检查 http。

标签: networking google-cloud-platform google-compute-engine load-balancing google-cloud-http-load-balancer


【解决方案1】:

TL;DR - 对两个后端服务使用相同的 HTTPS 健康检查。

健康检查和响应代码

您需要回复200响应码,并在配置的时间内正常关闭连接。

HTTP and HTTPS health checks

如果从负载均衡器到您的实例的流量使用 HTTP 或 HTTPS 协议,然后 HTTP 或 HTTPS 运行状况检查验证 实例运行状况良好,Web 服务器已启动并提供流量。

为了使 HTTP(S) 运行状况检查探测被视为成功, 实例必须返回带有代码 200 的有效 HTTP 响应并关闭 在配置的时间内正常连接。如果它这样做 连续指定次数,健康检查返回一个状态 例如,健康。如果实例失败指定数量 连续的健康检查探测,它被标记为不健康,没有任何 正在发送通知。不健康的实例不会收到新的 连接,但允许现有连接继续。 UNHEALTHY 实例继续接收健康检查探测。如果 实例稍后通过成功响应 指定数量的连续健康检查探测,它被标记 健康并开始接收新连接,再次没有任何连接 通知。

由于您有 2 个单独的后端服务(一个用于 HTTP,另一个用于 HTTPS),您将需要 2 个运行状况检查(尽管后端服务也允许在需要时重复使用相同的运行状况检查 - 请继续阅读),因为负载均衡器认为它们是独立的服务。

正如您已经确认的那样,使用 HTTPS 健康检查将适用于基于 HTTPS 的服务,但使用 HTTP 健康检查则不会。原因是您实际上返回的是用于永久 URL 重定向的 HTTP 301 响应代码,而不是预期的 HTTP 200 响应代码。

可能的解决方案

解决此问题的一种方法是对两个后端服务使用 HTTPS 运行状况检查,因为您的底层服务仍然相同。您失去了对重定向进行健康检查的能力,但很遗憾,Google Cloud Load Balancer 不支持。您也可以为两个后端服务共享相同的 HTTPS 健康检查资源。

CharlesB 发布的解决方案也可以,但我觉得您添加额外的重定向规则只是为了满足运行状况检查,并且无论如何都不会在您的服务路径上使用。您还需要一个单独的 HTTP 健康检查资源。我觉得对后端服务只使用 HTTPS 健康检查要简单得多,并且还可以验证您的服务是否可以处理新请求。

【讨论】:

    【解决方案2】:

    将除您的健康检查页面之外的所有内容重定向到 HTTPS。 How to force rewrite to HTTPS except for a few pages in Apache? 问题解释了如何做到这一点。 GCE Network load balancing 提到了这个要求,说“即使你的服务不使用 HTTP,你至少需要在运行状况检查系统可以查询的每个实例上运行一个基本的 Web 服务器。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-09
      • 2015-05-02
      • 2021-04-20
      • 2020-01-12
      • 2017-06-04
      • 2018-05-25
      • 2013-04-11
      • 2016-08-05
      相关资源
      最近更新 更多