我有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();
答案 0 :(得分:0)
好,我知道了。事实证明,您不需要销毁PHP会话。让我在处理Cookie时向您介绍我的想法。
在浏览器中调试cookie,我在Firefox中使用firebug。这将使您更好地了解cookie的存储方式和位置。 (不这样做会减慢我对Cookie的工作方式的了解)
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, "/");