【Tomcat】N个Tomcat间的Session共享

来源:互联网 发布:python 去除水印 编辑:程序博客网 时间:2024/06/15 20:53

文档概述

     本文档适用于开始了解Tomcat Session共享技术的人使用,涉及到该技术的产生背景,使用场景和环境配置等。

1. 环境配置

1.1兼容版本

      ·服务器使用的系统为CentOS Linux release7.0.1406

·     Tomcat版本为7.0.78.

2. 背景需求

      Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

      现实条件下由于服务器的负载能力有限,我们常常需要使用Tomcat集群来支持我们的访问。但是如果同一服务器集群间的Tomcat如果Session不同步,就会导致每当轮训机制生效,切换服务器时,就需要重新登录一次。(想象你已经在登录邮箱是输入了一次密码,当你点收信是,又给你切到了登录页面,再进去,点写信,又出来。)

3. 架构简介

 本文档就只是实现Session共享部分


4. 安装及配置使用

4.1解压安装包

      先将上文中的安装包放到两台服务器的/usr/local/文件夹下

       在/usr/local/文件夹下输入命令:

      tar zxf apache-tomcat-7.0.78.tar

      cd/usr/local/ apache-tomcat-7.0.78/

     ll

      得到如下结果:


4.2修改配置文件(两台都要改):

      修改内容:

     在<Engine name="Catalina" defaultHost="localhost"> 行下

     增加如下内容:

<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="本机IP"  

                     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>  

 

4.3防火墙设置

    安装插件:yum install firewalld 安装firewalld

     状态查看: firewall-cmd--state      

     开启:service firewalld start

    关闭:service firewalld stop

 

    我们需要关闭防火墙

4.4运行效果测试

     我们需要准备一个最简单的Web项目,发布一个war包放到Tomcat/webapps下就行:

<%@ 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//DTDHTML 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 mypage"> 

   <!--

   <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> 


      需要注意的是,需要实现Web共享的项目里的WEB.xml必须添加一个标签<distributable/>


然后访问Nginx所在的两个服务器就会发现虽然一直在轮训不同的Tomcat服务器。但是SessionID是没有变的。

5. 可能遇到的问题

1、需要将服务器的防火墙关闭;关闭命令:service firewalld stop  查询命令:firewall-cmd --state

      原因:同步时不仅需要tomcat中的Server.xml文件中的IP还需要其他的建立通信的端口,所以目前实验结果是必须将防火墙的端口关闭才能Session同步成功;

 2、需要将Server.xml中的Auto属性改为本机的I

      原因:在集群进行同步时如果是auto的话会走的服务器本地的lo网卡,导致Session不能同步成功



原创粉丝点击