php - 带 cookie 的 Apache 负载均衡器,在 PHP 中更改 ROUTEID / 粘性 cookie
问题描述
我有 2 台服务器,我正在使用 apache 负载平衡器对流量进行负载平衡。这有两个目的,负载平衡和反向代理,以便所有主机具有相同的 URL。此设置使用 cookie 来提高粘性非常有效。
在某些情况下,我可能需要“强制”平衡器使用特定主机(BalanceMember)。这是一个绝对要求,其原因超出了本文的讨论范围。
例如,我只需将 ROUTEID cookie 从 1 更改为 2,就可以使用 PHP 进行这项工作。我的第一个问题是,为什么我必须在更改 COOKIE 值后销毁 PHP 会话才能使其生效。如果我在更改会话后不销毁会话,则 ROUTEID 不会更改。
我的第二个问题是,这是实现这一目标的最佳方式,请记住它确实可以按预期工作。
阿帕奇代理.conf
<VirtualHost *:80>
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; Expires=-1 path=/" env=BALANCER_ROUTE_CHANGED
<Proxy "balancer://mycluster">
BalancerMember http://myhost1.example.com/ route=1
BalancerMember http://myhost2.example.com/ route=2
ProxySet lbmethod=byrequests failontimeout=on
</Proxy>
ProxyPreserveHost Off
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.0/8
# Enable SSL Proxying
ProxyRequests Off
SSLProxyEngine on
ProxyPass / balancer://mycluster/ stickysession=ROUTEID
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
更改 ROUTEID 的 PHP 代码
session_name("my_example_session");
session_start();
ob_start();
$cookie_name = "ROUTEID";
$cookie_value = "balancer.2";
setrawcookie($cookie_name, $cookie_value, time() + (86400 * 30)); // 86400 = 1 day
ob_flush();
session_destroy();
session_write_close();
解决方案
好的,我想通了。事实证明,您不需要销毁 PHP 会话。让我带你了解我在处理饼干时的倾向。
在浏览器中调试 cookie,我在 Firefox 中使用 firebug。这将使您更好地了解 cookie 的存储方式和位置。(不这样做会减慢我对 cookie 工作原理的了解)
Cookie 使用路径,因此您可以在“/”和“/my/path”中使用相同的 cookie 名称,并且它们可以有两个不同的值。这就是让我头疼的原因:- 我在“/”中设置了原始的粘性 cookie,并在“/my/path”中对其进行了修改。
阿帕奇配置
代替
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; Expires=-1 path=/" env=BALANCER_ROUTE_CHANGED
和
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
PHP
$cookie_name = "ROUTEID";
$cookie_value = "balancer.2";
setrawcookie($cookie_name, $cookie_value, 0, "/");
推荐阅读
- python - python中的对象创建差异
- java - MongoDB + HibernateOGM + Spring Boot 自动创建数据库
- audio - SIM800C : 上传的音频 AMR 文件在通话过程中播放时有噪音
- python - 如何使用 SQL Alchemy 在 DB 表中维护唯一的字母数字序列?
- javascript - 如何用js实现talib的LINEARREG_SLOPE函数?
- java - Android WorkManager - 手机充满电时运行任务
- python - 在汇源图中找到最小加权匹配
- algorithm - 来自未知长度的流的均匀分布的样本
- e2e-testing - 赛普拉斯:如何知道元素在使用 If 条件时是否可见?
- android - 如何以编程方式拒绝Android版本9中的呼叫.....????/