Tomcat集群之会话保持

Tomcat集群之会话保持

一:环境介绍:

     OS:CentOS7.3

     Ngninx:1.10.2

    Tomcat:7

    注:便于实验,此处关闭全部服务器的防火墙,selinux(iptables -F  于  setenforce 0)

二:会话保持的重要性

    在生成环境中,我们的Tomcat服务器肯定要做冗余或者高可用,如果没有做会话保持,那么用户访问页面时只要状态丢失,那么是会造成cookie丢失这种情况的,举个最简单的例子:结合上边的图大家可以想象下,你的Tomcat服务器做了冗余,但是没有做会话保持, 用户访问你的网站时登录了自己的账号(此时访问的Tomcat1),而Tomcat1服务器是会给用户生成cookie来记录账户信息。此时如果你长时间未操作,或者刷新由于Nginx调度用户会访问到Tomcat2上,而用户浏览器里保存的是Tomcat1的cookie,所以会重新请求!接下来可以想象了,用户需要进场去输入自己的账号信息,这样的用户体验是非常差的!而这里,我会演示,怎么做Tomcat集群的会话保持。

三:操作步骤

  

    在Tomcat1服务器上

    

#安装Tomcat
[root@tomcat1] yum install -y tomcat-webapps tomcat-admin-webapps tomcat
#安装Tomcat测试应用
[root@tomcat1] mkdir -pv /usr/share/tomcat/webapps/test/{libclasses,lib,WEB-INF}
[root@tomcat1]nano /usr/share/tomcat/webapps/test/index.jsp
#贴入以下测试代码(请勿用vim)
<%@ page language="java" %>
<html>
    <head><title>TomcatA</title></head>
    <body>
        <h1><font color="red">TomcatA.magedu.com</font></h1>
        <table align="centre" border="1">
              <tr>
                         <td>Session ID</td>
        <% session.setAttribute("magedu.com","magedu.com"); %>
        <td><%= session.getId() %></td>
        </tr>
        <tr>
                             <td>Created on</td>
                     <td><%= session.getCreationTime() %></td>
             </tr>
        </table>
    </body>
</html>
#加入会话保持配置信息
[root@tomcat1]vim /etc/tomcat/server.xml
#在Engine配置段中贴入以下代码
 <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.32"    
                        port="45564"            
                        frequency="500"         
                        dropTime="3000"/>
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                address="192.168.37.138"          
                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>
#然后修改Engine 添加 jvmRoute="TcA"
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TcA" >
#启动Tomcat
[root@tomcat1]systemctl start tomcat
[root@tomcat1]ss -tunl  
#稍等几秒查看8080和45564端口是否启用

    在Tomcat2服务器上

        

#安装Tomcat
[root@tomcat1] yum install -y tomcat-webapps tomcat-admin-webapps tomcat
#安装Tomcat测试应用
[root@tomcat1] mkdir -pv /usr/share/tomcat/webapps/test/{libclasses,lib,WEB-INF}
[root@tomcat1]nano /usr/share/tomcat/webapps/test/index.jsp
#贴入以下测试代码(请勿用vim)
<%@ page language="java" %>
<html>
    <head><title>TomcatB</title></head>
    <body>
        <h1><font color="blue">TomcatB.magedu.com</font></h1>
        <table align="centre" border="1">
              <tr>
                         <td>Session ID</td>
        <% session.setAttribute("magedu.com","magedu.com"); %>
        <td><%= session.getId() %></td>
        </tr>
        <tr>
                             <td>Created on</td>
                     <td><%= session.getCreationTime() %></td>
             </tr>
        </table>
    </body>
</html>
#加入会话保持配置信息
[root@tomcat1]vim /etc/tomcat/server.xml
#在Engine配置段中贴入以下代码
 <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.32"    
                        port="45564"            
                        frequency="500"         
                        dropTime="3000"/>
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                address="192.168.37.129"          
                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>
#然后修改Engine 添加 jvmRoute="TcA"
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TcB" >
#启动Tomcat
[root@tomcat1]systemctl start tomcat
[root@tomcat1]ss -tunl  
#稍等几秒查看8080和45564端口是否启用

    在Nginx服务器上

        

[root@tomcat1]yum install -y nginx
[root@tomcat1]vim /etc/nginx/nginx.conf
#在http配置段中添加
upstream tomsrv {
                server 192.168.37.138:8080;
                server 192.168.37.129:8080;
        }
#在server配置段的默认根location中
location / {
            proxy_pass http://tomsrv;
        }
[root@tomcat1]systemctl start nginx

四:测试访问

Tomcat集群之会话保持

Tomcat集群之会话保持

 无论你访问到哪台服务器,重新访问session是被记录的,不需要重新请求。  如果各位有余力还可以把tomcat服务器中的server.xml文件中的<cluster>配置段删除,再测试访问,你会发现每次请求的session都不一样。

五:实验中遇到的问题

    tomcat的8080 和45564端口起不来,首先确保配置文件正确,然后确保你的网卡支持MULTICAST,其他问题看日志解决。

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 192.168.37.138  netmask 255.255.255.0  broadcast 192.168.37.255        inet6 fe80::6189:fb1b:4a6e:af04  prefixlen 64  scopeid 0x20<link>        ether 00:0c:29:ea:d6:e8  txqueuelen 1000  (Ethernet)        RX packets 63440  bytes 69237595 (66.0 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 20513  bytes 2979675 (2.8 MiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

原创文章,作者:cnc,如若转载,请注明出处:http://www.178linux.com/76852

(0)
cnccnc
上一篇 2017-05-25 09:10
下一篇 2017-05-25 09:42

相关推荐

  • Linux开学一周的学习心得

    Linux,这个名字第一次听到是通过张超老师给我讲解,因为我在学校学的是金融数学,平时对这方面没有太多接触。当时对Linux就知道是个系统,随后在网上搜了搜,了解也不太多。 直到今天已经来马哥教育一星期了,刚入学的这一星期上课,都是一些基本的命令,感觉学着还蛮有意思,教学的安排也非常合理,我们大家学一天还能自己动手操作一天,既能专心听课,又能把学到的知识巩固…

    2017-07-15
  • shell脚本之 select 循环菜单及 函数

    select 循环与菜单 select variable in list    do      循环体命令   done select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入 用户输入菜单列表中的某个数字,执行相应的命令…

    Linux干货 2016-08-22
  • 从shell眼中看世界–展开和引用

    这篇博客的目的在于加深对于展开和引用的理解,阐释展开和引用之间联系。 ‘ ‘ :强引用,其中的变量引用不会被替换为变量值,而保持原字符串       ” “:弱引用,其中的变量引用会被替换为变量值    如果之前对于’ …

    Linux干货 2017-04-16
  • linux —————-目录配配置【FHS】

    linux 目录配配置【FHS】 /根目录的意义与内容 根目录是整个系统最重要的一个目录;根目录与开机、还原、系统修复等操作有关 FHS建议标准: 根目录所在的分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好 FHS定义的目录含义 /bin :系统存放执行文件的目录,但是bin比较特殊【bin放置的是在单用户维护模…

    Linux干货 2017-04-17
  • 第四周作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。[root@localhost ~]# cp -r /etc/skel/ /home/tuser1[root@localhost /]# chmod -R g=,o= /home/tuser1 2、编辑/etc/group文件…

    Linux干货 2017-03-04
  • 文本处理工具练习题(包含正则)

    正则练习题(包含文本处理练习题) 问题 找出ifconfig命令结果中本机的所有IPv4地址  查出分区空间使用率的最大百分比值 查出用户UID最大值的用户名、UID及shell类型 查出/tmp的权限,以数字方式显示 统计当前连接本机的每个远程主机IP的连接数,并按从大 到小排序 答; ifconfig | grep -o '[0-9]\…

    Linux干货 2016-08-08