多个Tomcat之间实现Session共享

对于高访问量、高并发量的网站或web应用来讲,目前最多见的解决方案应该就是利用负载均衡进行server集群,例如比较流行的nginx+memcache+tomcat。集群以后好比咱们有N个Tomcat,用户在访问咱们的网站时有可能第一次请求分发到tomcat1下,而第二次请求又分发到了tomcat2下,有过web开发经验的朋友都知道这时session不一致会致使怎样的后果,因此咱们须要解决一下多个tomcat之间session共享的问题。css

 

首先咱们须要下载tomcat,这里咱们选择tomcat7的解压缩版:html

下载完成后咱们新建一个目录叫tomcat_cluster(tomcat集群的意思),直接解压下载好的tomcat,并重命名为tomcat1,能够看到目录结构以下:java

 

准备一个最简单的web项目(在IDE中建立部署,拷贝出来便可),并修改index.jsp的内容以下:nginx

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
<%  
String path = request.getContextPath();  
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
%>  
  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
  <head>  
    <base href="<%=basePath%>">  
      
    <title>My JSP 'index.jsp' starting page</title>  
    <meta http-equiv="pragma" content="no-cache">  
    <meta http-equiv="cache-control" content="no-cache">  
    <meta http-equiv="expires" content="0">      
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    <meta http-equiv="description" content="This is my page">  
    <!-- 
    <link rel="stylesheet" type="text/css" href="styles.css"> 
    -->  
  </head>  
    
  <body>  
      
        SessionID:<%=session.getId()%>  
        <BR>  
        SessionIP:<%=request.getServerName()%>  
        <BR>  
        SessionPort:<%=request.getServerPort()%>  
        <%  
        out.println("This is Tomcat Server 11111");  
        %>  
  </body>  
</html>  
 


这样基本工做就作完了,下面须要修改tomcat的配置文件,咱们打开conf下的server.xml文件,找到下面这一行:web

 

<Engine name="Catalina" defaultHost="localhost"> 

 

不须要作任何修改,在这一行的下面加入以下代码:apache

 

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  
                channelSendOptions="8">  
  
         <Manager className="org.apache.catalina.ha.session.DeltaManager"  
                  expireSessionsOnShutdown="false"  
                  notifyListenersOnReplication="true"/>  
  
         <Channel className="org.apache.catalina.tribes.group.GroupChannel">  
           <Membership className="org.apache.catalina.tribes.membership.McastService"  
                       address="228.0.0.4"  
                       port="45564"  
                       frequency="500"  
                       dropTime="3000"/>  
           <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"  
                     address="auto"  
                     port="4000"  
                     autoBind="100"  
                     selectorTimeout="5000"  
                     maxThreads="6"/>  
  
           <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">  
           <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>  
           </Sender>  
           <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>  
           <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>  
         </Channel>  
  
         <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  
                filter=""/>  
         <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>  
  
         <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"  
                   tempDir="/tmp/war-temp/"  
                   deployDir="/tmp/war-deploy/"  
                   watchDir="/tmp/war-listen/"  
                   watchEnabled="false"/>  
  
         <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>  
         <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>  
</Cluster> 

 


这个就是tomcat自带的集群配置了,咱们能够在tomcat官方文档中的cluster-howto.html中看到相关注意事项,其中有一条须要注意一下:浏览器

 

Make sure your web.xml has the <distributable/> elementtomcat

很明显是说咱们的web项目的web.xml文件中须要有<distributable/>这个元素,因此在咱们刚才引入的web项目中作如上的修改。session

这样咱们的基本配置就完成了,由于是集群,因此在tomcat_cluster目录下拷贝一份tomcat1,并重命名成tomcat2。并发

 

注意一下须要修改的地方:

一、首先确定是端口号,全部port字样的配置都修改一下保证两个不重复,我这里将tomcat1的端口修改成7080,tomcat2的端口修改成9080。

二、修改webapps下的项目中的index.jsp文件,由于要测试session共享因此有必要区分一下,在jsp中加入一行静态文本便可,我这里是用“This is Tomcat Server 111111”和“This is Tomcat Server 22222”来进行区分的,下面分别启动两个tomcat进行测试,咱们分别运行bin目录下的startup.bat,发现第一个tomcat启动以后,第二个没法启动,这是由于启动脚本(startup.bat)没有修改,引用一样的CATALINA_HOME必然会报错,因此请注意下面的第三点。

三、为咱们的这两个tomcat添加两个环境变量——CATALINA_HOME二、CATALINA_HOME3分别指向这两个tomcat的安装目录:

而后分别修改两个tomcat中bin目录下的两个脚本:startup.bat和catalina.bat,把tomcat1中的这两个文件中的%CATALINA_HOME%替换为%CATALINA_HOME2%,把tomcat2中的这两个文件中的%CATALINA_HOME%替换为%CATALINA_HOME3%,如今再启动tomcat,会发现两个tomcat均可以正常启动了,解压版的tomcat须要这样配置一下。在浏览器中检测一下tomcat是否能够成功访问:

 

OK,再访问一下咱们的测试项目,看看session是否一致:

能够发现咱们两个tomcat下的这两个项目Session彻底一致,刷新也不会变,到此为止咱们就算成功实现了Session共享,也就是说咱们tomcat已经成功完成了任务,剩余的交给nginx就OK了。最后再强调一下,这两个testdemo的web.xml中须要加这么元素:

 

 

总结

介绍了tomcat集群以前的必备工做——session共享的配置,以及同时启动两个tomcat解压缩版须要注意的问题,但愿对看到的同窗有所帮助吧,The End。

相关文章
相关标签/搜索