4

我尝试在 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 编码。Web 服务器在请求的 URL 中搜索查询参数。使用stickysession 再次指定参数的名称。该参数的值用于查找具有等于该值的路由的成员工作人员。由于提取和操作响应中包含的所有 URL 链接并不容易,因此向每个链接添加参数的工作通常由生成内容的后端完成。在某些情况下,使用 mod_substitute 或 mod_sed 通过 Web 服务器执行此操作可能是可行的。但是,这可能会对性能产生负面影响。

我在邮递员中发送了 10 次以下请求:

https://{{myserver}}/doc?jsessionid=node1

我注意到请求被传递给node1(5 个请求)和node2(还有 5 个请求)。但是我定义了stickysession,所以它应该选择node1,并且每次都去这个节点。

我的目标是客户端将发送请求https://{{myserver}}/doc?jsessionid=nodeX,请求将传递给nodeX不使用cookie..,仅使用粘性是URL编码)。

例如,客户端发送请求https://{{myserver}}/doc?jsessionid=node110 次。每 10 次请求将由https://localhost:5006.

我做错了什么?

4

1 回答 1

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/

我自己对此进行了测试,效果很好!

于 2015-06-25T16:51:24.573 回答