配置tomcat集群,关键是要解决session的问题,这篇文章讲述了自己理解的session含义,apache和tomcat如何配置以解决session问题。
session是什么
http是无状态协议,两次http请求之间没有任何联系。
实际上,有很多情况,后面一次请求,需要看前一次的结果。
最典型的就是用户登录,第一次http请求重定向到登录页面,用户登录后,第二次http请求就不需要再重定向到登录页面。
记录用户登录的信息,就是session,一般使用cookie实现session。
tomcat集群的session
如果tomcat使用session,那么单单配置load balance会引起session丢失。
比如系统需要记录用户登录信息,有两台应用服务器,用户在第一台应用服务器上登录,如果第二次http请求定位到第二台应用服务器,第二台应用服务器没有登录信息,session丢失了,会让用户再登录一次,引起错误。
解决方法有两个:
- session replication,session复制。第一台应用服务器有session信息后,复制到所有应用服务器。 
- session sticky,session保持。用户第一次访问应用服务器后,以后所有访问都访问同一台应用服务器。 
 两个方法各有优缺点,session复制耗费较多资源,但是基于每次http访问进行负载均衡,更加均衡。session保持比较节约资源,但是基于用户访问进行负责均衡,负载均衡程度取决于用户的访问模式,同时应用服务器切换时,会引起会话丢失,用户需要重新登录。
 session复制在tomcat文档中有详细的说明,甚至专门有一篇HowTo,下面重点介绍一下session sticky的配置方法。- 配置session sticky的两种模式- session sticky的目标是记住用户第一次http请求访问的应用服务器,之后的http请求仍然访问这台应用服务器。 
 一般使用cookie记录第一次访问的应用服务器标识,有两种方法
- 在apache中打标识,然后通过apache设置cookie,实现session sticky。 
- 在tomcat中打标识,tomcat设置cookie,apache识别cookie,分配相应的应用服务器,同样实现session sticky。 - 基于apache的session sticky
- 在BalancerMember中用route指令指定应用服务器标识。 
- 然后用Header指令在HTTP头中设置Cookie,Cookie中指定本次访问的应用服务器标识。 
- 增加ProxySet,指定依据ROUTEID使用stickysession方式。 
 上面方法在Apache proxy_balancer官方文档中有详细说明。
 用这种方法只需要在apache中配置,tomcat不需要特别的配置。- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10- # reverse proxy for tomcat 
 <Proxy balancer://tomcat>
 BalancerMember http://192.168.56.2:8080 route=1
 BalancerMember http://192.168.56.2:8180 route=2
 ProxySet stickysession=ROUTEID
 Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; secure" env=BALANCER_ROUTE_CHANGED
 </Proxy>
 
 Proxypass /tomcat balancer://tomcat/tomcat
 ProxypassReverse /tomcat balancer://tomcat/tomcat- apache和tomcat联合配置实现session stikcy
- 在tomcat配置中,指定应用服务器标识。根据文档,在engine中指定。 
- apache配置中,增加ProxySet,指定依据JESSIONID使用stickysession方式。JESSIONID是tomcat默认设置的cookie值。 - tomcat配置,两个应用服务器分别指定 - 1和- 2- 1 - <Engine name="Catalina" defaultHost="localhost" jvmRoute="1"> - apache配置 - 1 
 2
 3
 4
 5
 6
 7
 8
 9- # reverse proxy for tomcat 
 <Proxy balancer://tomcat>
 BalancerMember http://192.168.56.2:8080
 BalancerMember http://192.168.56.2:8180
 ProxySet stickysession=JSESSIONID
 </Proxy>
 
 Proxypass /tomcat balancer://tomcat/tomcat
 ProxypassReverse /tomcat balancer://tomcat/tomcat