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

相关推荐

  • LVM的创建与管理

    一、基本概念     1、LVM是逻辑盘卷管理(LogicalVolumeManager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。     2、why:通常在安装Linux系统的时候对磁盘进行一盘的分区,一旦日后分区或整个磁盘的空间…

    Linux干货 2016-06-22
  • 建立私有CA的方法

    建立私有CA的方法 建立私有CA的工具:     OpenCA     Openssl 证书申请及签署步骤:     1,生成申请请求:     2,RA核验;    &…

    Linux干货 2016-09-19
  • 马哥教育网络班22期+第六周课程练习

    vim编辑器的使用总结    vim编辑器是模式化的全屏文本编辑器,有三种基本模式:        编辑模式        输入模式   &…

    Linux干货 2016-10-24
  • ​ 基于Sentinel实现redis主从自动切换

    Sentinel(哨兵)是用于监控redis集群中Master状态的工具,它可以实现对redis的监控、通知、自动故障转移。 Sentinel作用: Master状态检测 当被监控的某个 Redis Master异常无法连接时 Sentinel 可以向系统管理员发送通知, 也可以通过 API 向其他程序发送通知,并且进行Master-Slave切换,将其中一…

    Linux干货 2016-02-14
  • Bash shell 脚本编程全攻略(上篇)

    Bash shell 脚本编程全攻略(上篇)   什么是shell脚本呢? 当命令不在命令行上执行,而是通过一个文件执行时,该文件就称为shell脚本,脚本以非交互的方式运行。Shell脚本把命令通过一些语法组织起来,便能实现特定的功能。   Shell脚本主要运用在系统运维中,主要功能有: 自动化常用命令; 执行系统管理和故障排除; 创…

    Linux干货 2016-08-29
  • 初入linux_基础(一)

    初入Linux知识点总结(一) 一、理论知识 1、时间点: 1946年 第一代计算机ENIAC诞生于美国宾州大学,特点:块头大、效率低 数学家冯诺•依曼提出计算机体系结构组成部分:计算器、运算器、存储器、输入设备、输出设备 1969年 UNIX在美国贝尔实验室诞生 1984年 GNU项目和软件基金会成立 1991年 Linux在芬兰赫尔辛基诞生 2、计算机的…

    Linux干货 2017-02-18