当会话 ID 在 URL 中时,Apache 负载平衡

当会话 ID 在 URL 中时,Apache 负载平衡

我真的不知道...

我有一个 Java Web 应用程序,它将会话 ID 存储在 URL 中,而不是使用 Cookie。我想在 2 个 tomcat 服务器上运行该应用程序,并在它们前面放置一个 Apache 服务器以实现负载平衡。


            __ tomcat1
Apache ----/
           \__ tomcat2

通过在Tomcat文件中设置jvmRouteto ,url就会变成。所以可以通过查看url来实现session粘性,并路由到对应的服务器。tomcat1server.xmlhttp://url;jsessionid=id.tomcat1

我知道mod_proxymod_jk和 会进行负载平衡,但它们的粘性会话仅在会话 ID 存储在 Cookie 中时才有效。在我的例子中,会话 ID 编码在 URL 中。我该如何进行负载平衡?

答案1

也许你的配置有误。文档未指定 sticky-session 仅适用于 cookies。

stickysession - Balancer 粘性会话名称。该值通常设置为 JSESSIONID 或 PHPSESSIONID 之类的值,具体取决于支持会话的后端应用程序服务器。如果后端应用程序服务器对 cookie 和 url 编码 ID 使用不同的名称(如 servlet 容器),请使用 | 将它们分开。第一部分用于 cookie,第二部分用于路径。

因此您可以像下面这样指定 sessionid。

ProxyPass / balancer://mycluster/ stickysession=|jsessionid

希望这可以帮助。

答案2

为了创建粘性,我们需要在配置中添加以下行(mod_proxy)

Header add Set-Cookie "BALANCEID=hej.%{BALANCER_WORKER_ROUTE}e; path=/;" env=BALANCER_ROUTE_CHANGED

然后在配置中指定路由名称

<Proxy balancer://mycluster>
    BalancerMember http://tomcat sever1.ip:8080  route=AcZxv
    BalancerMember http://tomcat server2.ip:8080 route=AcXxv
    lbmethod=byrequests stickysession=BALANCEID
</Proxy>

并将这些路由名添加到 tomcat 服务器的 catalina.properties 中的 tcserver.node 中

tcserver.node=AcZxv (tomcat 1st server)
tcserver.node=AcXxv (tomcat 2nd server)

相关内容