我已经将我的linux服务器放在GCP上,在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>我已经给vm一个外部ip入口来测试重定向是否有效。
然后我配置了负载均衡器。我这样做是为了让前端同时接受http和https。对于后端,我提供了两个服务:
一个使用http,另一个使用https,这样如果有人通过http进入,它将被转发,然后通过上面所示的代码重定向到https。
对于这两个后端服务,都进行了基本的健康检查:
对于http:端口: 80,超时: 5s,检查间隔: 5s,不健康阈值:2次尝试 对于https:端口: 443,超时: 5s,检查间隔: 5s,不健康阈值:2次尝试
https one运行良好,状态1为健康,但http健康检查状态为1实例健康状态为0。
如果将健康检查从http更改为https,然后再次更改http后端服务,则会在短时间内工作,但几分钟后,它再次状态为1个实例的0。
为了保持健康,我必须改变什么?
发布于 2017-07-20 15:33:16
TL;DR -对两个后端服务使用相同的HTTPS健康检查。
健康检查和响应代码
您将需要使用200响应代码进行响应,并在配置期间内正常关闭连接。
HTTP和HTTPS健康检查 如果负载均衡器到实例的流量使用HTTP或HTTPS协议,则HTTP或HTTPS健康检查将验证实例是否正常,web服务器是否处于正常状态并为流量服务。 要使HTTP(S)健康检查探针被视为成功,实例必须返回代码200的有效HTTP响应,并在配置期间内正常关闭连接。如果它在一行中执行指定次数的操作,则健康检查将返回该实例的健康状态。如果一个实例在一行中失败了指定数量的健康检查探针,则在没有发送任何通知的情况下将其标记为不健康。不健康的实例不接收新的连接,但允许继续现有的连接。不健康的实例继续收到健康检查探针。如果一个实例稍后通过成功响应指定数目的连续健康检查探针而通过健康检查,则该实例将被标记为“健康”,并开始接收新的连接,同样没有任何通知。
由于您有两个单独的后端服务(一个用于HTTP,另一个用于HTTPS),因此您将需要两个健康检查(尽管后端服务也允许在需要时重用相同的健康检查-继续读),因为负载均衡器认为它们是独立的服务。
正如您已经确认的,使用HTTPS健康检查将与基于HTTPS的服务一起工作,但是使用HTTP健康检查不会。原因是您实际上返回了一个HTTP 301响应代码,用于永久URL重定向,而不是预期的HTTP 200响应代码。
可能的解决办法
解决这一问题的一种方法是对两个后端服务使用HTTPS健康检查,因为您的底层服务仍然是相同的。您失去了健康检查重定向的能力,但不幸的是谷歌云负载均衡器不支持这一点。对于两个后端服务,您也可以共享相同的HTTPS健康检查资源。
CharlesB发布的解决方案也会起作用,但我觉得您只是为了满足健康检查而添加了额外的重定向规则,而且无论如何都不会在服务路径上使用。您还需要一个单独的HTTP健康检查资源。仅使用HTTPS对两个后端服务进行健康检查,我觉得要简单得多,而且还可以验证您的服务是否还活着以处理新的请求。
发布于 2017-07-19 21:15:36
将除健康检查页面之外的所有内容重定向到HTTPS。除了Apache中的几页之外,如何强制重写HTTPS?问题解释了如何做到这一点。GCE网络负载均衡提到了这个要求,说“即使您的服务不使用HTTP,您至少需要在每个健康检查系统可以查询的实例上运行一个基本的web服务器。”
https://stackoverflow.com/questions/44926010
复制相似问题