我尝试在Apache中定义粘性。这是proxy.conf中的定义:
<Proxy balancer://fs1>
BalancerMember https://localhost:5006/doc route=node1
BalancerMember https://localhost:5008/doc route=node2
ProxySet stickysession=JSESSIONID|jsessionid
</Proxy>
ProxyPass /doc balancer://fs1
或:
ProxyPass "/doc " "balancer://fs1" stickysession=JSESSIONID|jsessionid scolonpathdelim=On
<Proxy balancer://fs1>
BalancerMember https://localhost:5006/doc route=node1
BalancerMember https://localhost:5008/doc route=node2
</Proxy>
我尝试使用url查询参数以实现粘性(因为我知道不建议覆盖cookie)。正如Apache文档中所写:
实现粘性的第二种方法是URL编码。网络 服务器在请求的URL中搜索查询参数。该 使用stickysession再次指定参数的名称。该 参数的值用于查找具有路由的成员工作者 等于那个值。因为提取和操作并不容易 响应中包含的所有URL链接,通常是添加的工作 每个链接的参数由后端生成 内容。在某些情况下,通过网络进行此操作可能是可行的 服务器使用mod_substitute或mod_sed。这可能会产生负面影响 但是在性能方面。
我在邮递员中发送了以下请求10次:
https://{{myserver}}/doc?jsessionid=node1
我注意到请求被传递给node1
(5个请求)和node2
(也是5个请求)。但我定义了stickysession,因此它应该选择node1
,并且每次都转到此节点。
我的目标是客户端会发送请求https://{{myserver}}/doc?jsessionid=nodeX
,请求会转到nodeX
(不使用Cookie .. ,只使用粘性是URL编码)。
例如,客户端发送请求https://{{myserver}}/doc?jsessionid=node1
10次。请求每10次由https://localhost:5006
提供。
我做错了什么?
答案 0 :(得分:2)
经过一番搜索,我发现了问题所在。要通过URL请求参数进行路由,您必须包含“。”在'node1'之前如此:
https://{{myserver}}/doc?jsessionid=.node1
这篇博客文章指出了我正确的方向:
路由以字母数字命名非常重要 前缀,点,然后是数字。例如:server.1,t.2等 mod_proxy_balancer代码使用点和使用分割此路由名称 第二个值作为路径号。所以s.1会指向“route = 1” http://hkrishnan.in/2013/10/14/debugging-apache-mod_proxy_balancer/
我自己测试过,效果很好!