我们使用 Apache 来平衡后端 (IIS) Web 服务器的负载。我们的配置遵循例子来自 Apache 文档。我们尝试使用 Apache 设置的 cookie 实现粘性路由(即来自同一客户端的后续请求将被路由到同一上游服务器)。
我们的配置如下:
ProxyRequests off
ProxyPreserveHost On
<Proxy balancer://oursitename>
allow from all
BalancerMember http://1.2.3.4:80 route=1
# Further servers will be added here
ProxySet stickysession=ROUTEID
</Proxy>
# This line should set the correct cookie..
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
ProxyPass /balancer-manager !
ProxyPass / balancer://oursitename/ nofailover=Off
ProxyPassReverse / http://1.2.3.4:80/
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Allow from all
</Location>
现在 Apache 似乎不包含实际路由,但 cookie 只包含点“。”。我用 Firebug 和 Wireshark 检查过。因此在每个 HTTP 响应标头中都会出现(即每个图像/css/js):
Set-Cookie: ROUTEID=.; path=/
令人惊讶的是,当重新加载页面大约两次时,突然在大约十个响应中的一个中出现了 Set-Cookie: ROUTEID=.2。浏览器在后续请求中使用此值,然后不会通过进一步的 Set-Cookie 条目确认这些请求。因此,Apache 似乎认为路由 .2 有效。我不明白为什么它总是 .2,即使我从平衡器中移除第二台服务器,这个数字也会出现!
谁能向我解释这里发生了什么以及我该如何解决它?
答案1
我不确定为什么它保留 2。但是你的配置的一部分是
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
环境=BALANCER_ROUTE_CHANGED
如果路由器已改变则为 1,否则为 0,因此如果路由未改变则不会设置 cookie,除非需要更改为新值。
答案2
它保持为 2,因为您已设置 stickysession,使其坚持到当前成员服务器。清除缓存并刷新它应该会改变(尝试几次),然后坚持使用新值,直到您删除 cookie。要获得更好的想法,请参阅 https://wiki.apache.org/httpd/LoadBalanceWithoutStickyCookie
谢谢。