java – Apache Tomcat – 粘性会话和负载均衡问题

我正在面临Apache mod_proxy_balancer关于粘性会话的一些问题.

我们开发了一个运行在Tomcat上的安静的Java服务.实际的后端使用Acegi安全性,使用Auth Basic身份验证.

建筑是(对不起,我是一个新用户,我不能发布图像):

     --------------------
     |Java Reverse Proxy|
     --------------------
            |
     --------------------
     |Apache load balancer|
     --------------------               
            |
    --------|--------
    |               |
--------        --------    
|tomcat1|       |tomcat2|
--------        --------    

我们有这个“Java反向代理”来执行各种业务.它还对Tomcat(Tomcat1,Tomcat2)进行了基本身份验证.

最终用户调用URL:http:/// a / b?username = foo& password = bar& session = xxx

然后,反向代理代理对Apache的请求,将凭据作为基本身份验证令牌发送.

最终用户有三种不同的网址:

http://<java reverse proxy domain>/service1
http://<java reverse proxy domain>/service2
http://<java reverse proxy domain>/service3

只有service1和service2通过Acegi进行保护. service3是匿名访问的(这是一个要求).

我们在Apache中有以下配置来执行负载平衡:

<Proxy balancer://cluster>
    Header set Cache-Control no-cache
    Header set Pragma no-cache
    BalancerMember http://xxx:9671 route=server1
    BalancerMember http://xxx:9672 route=server2
</Proxy>

ProxyPreserveHost On
ProxyPass / balancer://cluster/ stickysession=JSESSIONID
ProxyPassReverse / balancer://cluster/ stickysession=JSESSIONID

在第一次调用service1时,将JSESSIONID返回给用户,然后他将该会话信息作为请求的一部分发送(在查询字符串,会话参数中)

为了在后端tomcats(tomcat1,tomcat2)中维护会话状态,java反向代理从查询字符串获取会话,并将其作为JSESSIONID cookie发送到代理的tomcat.

一切工作都非常适用于基本保护的URLS.但是,当用户调用第三个url(这是公开的)时,Apache不能正确地执行负载平衡.

例如,当我打电话给服务1或2时,我得到以下Apache日志:

[Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(280): proxy: BALANCER: Found value "3FB8F8135173BBBE78E5E4BBD6F5C8FB" for stickysession JSESSIONID
[Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(1003): proxy: Entering byrequests for BALANCER (balancer://cluster)
[Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(1046): proxy: byrequests selected worker "http://xxx:9672" : busy 0 : lbstatus 1

这是非常好的,因为请求是为了目标tomcat2.

但是当我打电话给service3时,我得到:

[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(280): proxy: BALANCER: Found value "3FB8F8135173BBBE78E5E4BBD6F5C8FB" for stickysession JSESSIONID
[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(1003): proxy: Entering byrequests for BALANCER (balancer://cluster)
[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(1046): proxy: byrequests selected worker "http://xxx:9671" : busy 0 : lbstatus 0

可以看到,即使JSESSIONID cookie相同,Apache将请求发送到错误的tomcat(这里是tomcat1).

可以这样一个事实,service3的url不需要Auth Basic认证,其中service1和service2做什么?

我很确定我做错了,但我一直在寻找很长时间,我不能让它上班.

您的帮助非常感激.

谢谢

最佳答案
我在JSESSIONID上看不到jvmRoute后缀. mod_proxy使用jvmRoute将粘性会话正确路由到您的Tomcat实例. jvmRoute在您的tomcat服务器配置中声明(每个服务器实例都有自己唯一的jvmRoute标识符.

转载注明原文:java – Apache Tomcat – 粘性会话和负载均衡问题 - 代码日志