GCP负载均衡器实例在短时间内变得不健康

时间:2017-07-05 12:14:40

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

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

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

我已经给vm一个外部ip地址,以测试重定向是否有效。

然后我配置了负载均衡器。我已经做到这一点,以便frondend同时接受http和https。对于后端,我提供了2项服务:

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

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

  

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

     

for https:port:443,timeout:5s,check interval:5s,不健康   阈值:2次尝试

https一个正常工作,并指出1个实例中的1个健康,但http运行状况检查表明0个实例健康

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

为了保持健康,我必须改变什么?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

TL; DR - 对后端服务使用相同的HTTPS运行状况检查。

健康检查和响应代码

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

  

HTTP and HTTPS health checks

     

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

     

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

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

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

可能的解决方案

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

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