首页 > 解决方案 > 带 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();

标签: phpapachecookiesload-balancing

解决方案


好的,我想通了。事实证明,您不需要销毁 PHP 会话。让我带你了解我在处理饼干时的倾向。

  1. 在浏览器中调试 cookie,我在 Firefox 中使用 firebug。这将使您更好地了解 cookie 的存储方式和位置。(不这样做会减慢我对 cookie 工作原理的了解)

  2. 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, "/");

推荐阅读