多個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。

相關文章
相關標籤/搜索