0

我已经把我的 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>

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

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

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

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

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

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

https 工作正常并且状态 1 of 1 实例健康但 http 健康检查状态 0 of 1 实例健康

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

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

4

2 回答 2

1

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

健康检查和响应代码

您将需要使用200响应代码进行响应并在配置的时间内正常关闭连接。

HTTP 和 HTTPS 健康检查

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

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

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

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

可能的解决方案)

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

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

于 2017-07-20T15:33:16.500 回答
0

将除您的健康检查页面之外的所有内容重定向到 HTTPS。除了 Apache 中的几页外,如何强制重写为 HTTPS?问题解释了如何做到这一点。GCE 网络负载平衡提到了这个要求,说“即使你的服务不使用 HTTP,你至少需要在健康检查系统可以查询的每个实例上运行一个基本的 Web 服务器。”

于 2017-07-19T21:15:36.847 回答