带有cookie的Apache负载均衡器,在PHP中更改ROUTEID /粘性cookie

时间:2018-12-29 11:35:15

标签: php apache cookies load-balancing

我有2台服务器,正在使用apache负载均衡器来负载均衡流量。这有两个目的,负载平衡和反向代理,以便所有主机都具有相同的URL。 使用cookie来保持粘性,此设置非常有效。

在某些情况下,我可能需要“强制”平衡器使用特定主机(BalanceMember)。这是绝对必要,原因不在此讨论范围之内。

例如,我可以通过简单地将ROUTEID cookie从1更改为2来使用PHP。 我的第一个问题是,为什么要更改COOKIE值才能生效,为什么我必须销毁PHP会话。如果更改后我不销毁会话,则ROUTEID不会更改。

我的第二个问题是,牢记它确实可以按预期工作,这是实现此目标的最佳方法吗?

Apache proxy.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();

1 个答案:

答案 0 :(得分:0)

好,我知道了。事实证明,您不需要销毁PHP会话。让我在处理Cookie时向您介绍我的想法。

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

  2. Cookie使用路径,因此您可以在“ /”和“ / my / path”中使用相同的cookie名称,并且它们可以具有两个不同的值。这是引起我头痛的原因: 我在“ /”中设置了原始粘性cookie,并在“ / my / path”中对其进行了修改。

Apache Config

替换

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