我已经使用其他负载均衡器多年,因此我预计 GCP 负载均衡器在使用会话持久设置时能够以与其他负载均衡器相同的方式工作。
很遗憾,在 GCP LB 中为后端启用会话持久性似乎不会将某个客户端的所有请求发送到单个后端服务器(既不使用 Cookies 也不使用 IP 会话持久性选项)
这是一个已知的错误/行为还是我可以自己解决的问题?
我做了这个快速测试:
- 我创建了一个新的 HTTP LB 并为其分配了一个新的外部 IP。
- 我已将后端服务指向具有 2 个实例的实例组。
- 由于我的后端服务器正在运行 apache 和 mod_php,我创建了一个简单的 PHP 脚本(称为 get_up.php)来显示服务器 IP 地址(参见下面的代码)
- 最后,我在循环内运行了一个快速 curl 脚本,指向 $LBIP/get_ip.php 来查看会发生什么。
如果我在 Rackspace 中执行相同操作,我总是得到与结果相同的 IP,但在 GCP 中,我发现我可以随机访问我的两个后端服务器中的任何一个。
这是我的 PHP 测试脚本:
<?php
$realIP = file_get_contents("http://ipecho.net/plain");
echo "My Ip is " . $realIP;
echo "\n";
?>
这是我的测试运行:
➜ ~ while true; do curl -b cookie.txt -c cookie.txt $IP/get_ip.php; sleep 1 ; done
My Ip is 35.193.16.20
My Ip is 35.193.16.20
My Ip is 35.193.16.20
My Ip is 35.193.16.20
My Ip is 104.197.18.77
My Ip is 104.197.18.77
My Ip is 104.197.18.77
My Ip is 35.193.16.20
My Ip is 104.197.18.77
My Ip is 35.193.16.20
My Ip is 35.193.16.20
My Ip is 104.197.138.72
- 编辑 - 根据 BillThor 的评论,使用 Curl 命令发送 cookie。结果相同。
- 编辑——解决方案详情。
会话持久性在与单区域实例组一起使用时效果很好。我不得不牺牲多区域实例组的使用,直到这个问题得到解决。
答案1
如果您使用 cookie 进行持久保存,则需要提供一个 cookie jar 供 curl 使用。否则,每个请求看起来都像来自新用户。尝试以下命令:
while true; do -b cookie.txt -c cookie.txt curl $IP/get_ip.php; sleep 1 ; done
答案2
不幸的是,GCP 负载均衡器似乎“尚未”提供会话持久性。为了在我的 IDP 和 SP 之间保留 SAML 令牌,我必须在前面安装 NGINX PLUS 服务器。
可以使用 Cloud Launcher 进行部署:NGINX PLUS