我真的不知道...
我有一个 Java Web 应用程序,它将会话 ID 存储在 URL 中,而不是使用 Cookie。我想在 2 个 tomcat 服务器上运行该应用程序,并在它们前面放置一个 Apache 服务器以实现负载平衡。
__ tomcat1
Apache ----/
\__ tomcat2
通过在Tomcat文件中设置jvmRoute
to ,url就会变成。所以可以通过查看url来实现session粘性,并路由到对应的服务器。tomcat1
server.xml
http://url;jsessionid=id.tomcat1
我知道mod_proxy
和mod_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)