我目前有一个非常基本的群集,由在同一个VPS上运行的两个Tomcat 6.0.32实例( Tomcat1 和 Tomcat2 )组成。我通过Apache(在相同的VPS上)使用mod_proxy_ajp和mod_proxy_balancer作为负载均衡器。 我们使用基本表单身份验证(通过j_security_check)为用户创建经过身份验证的会话。
负载均衡器运行良好,并且两个实例之间正在成功复制未经身份验证的会话。但是,我无法在每个实例之间替换经过身份验证的会话。
我正在使用一个名为session.jsp的非常基本的JSP(基于JPS模板http://www.syslog.gr/articles-mainmenu-99/15-tomcat-cluster-session-replication.html)来测试会话以查看它是否是新会话并打印出JSESSIONID。我在受保护区域内有一个JSP副本,在受保护区域外有一个副本。
我运行了以下测试:
测试1)
我在 Tomcat1 上的应用程序保护区域外访问session.jsp,我记下了JSESSIONID,并与负载均衡器确认 Tomcat1 处理了请求。然后我关闭 Tomcat1 并刷新页面。该请求现在由 Tomcat2 处理(由负载均衡器确认)。页面完成加载后,我会看到我的原始JSESSIONID,并且我的会话已经存活。
测试2)
我在 Tomcat1 上的应用程序保护区域内访问session.jsp。这会提示我登录。登录后,我被发送到session.jsp并记下我的JSESSIONID并确认负载均衡器,而不是 Tomcat1 处理请求。然后我关闭 Tomcat1 并刷新页面。该请求现在由 Tomcat2 处理(由负载均衡器确认)。当页面加载时,我检查我的cookie。我现在有一个新的JSESSIONID,我再次被提示登录。
到目前为止,我认为经过身份验证的会话没有像未经身份验证的会话一样被复制。这是一个很好的理由还是指向配置问题?
答案 0 :(得分:0)
您尚未在sticky_session模式下运行,并且可以使用worker.loadbalancer.sticky_session = 1
启用它并检查:http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html