黑马程序员技术交流社区

标题: Nginx+tomcat集群并实现session共享(广播机制、redis两种方式) [打印本页]

作者: 小蜀哥哥    时间: 2017-9-5 12:51
标题: Nginx+tomcat集群并实现session共享(广播机制、redis两种方式)
本帖最后由 小蜀哥哥 于 2017-9-5 12:51 编辑

      简介:随着互联网的飞速发展,互联网的用户也飞速增加。随之而来就是如何解决大量用户访问导致高并发的问题,倘若用单机版的tomcat在理想状态下能够承受的并发访问量大概为150到200左右,为了解决高并发就需要引入负载均衡技术。负载均衡就是一个web服务器解决不了的问题可以通过多个web服务器来平均分担压力来解决,并将发过来的请求被平均分配到多个后台web服务器来处理,这样压力就被分解开来。如:将同一个系统部署到多台tomcat服务器,每个tomcat服务器都可以独立提供服务——tomcat集群,并且通过负载均衡技术反向代理tomcat集群,这样既可提供系统的访问压力。负载均衡技术有两种方式实现:(1) 硬件负载均衡——如F5 (2)软件负载均衡——如Nginx、Apache等,但是硬件负载均衡的成本比较大,所以一般都采用软件负载均衡。而很多大型网站如京东、淘宝都采用Nginx负载均衡解决高并发问题,所有我们这里也采用Nginx实现负载均衡,反向代理tomcat集群。
一.Nginx+tomcat广播机制实现session共享

     1. 环境准备
        
     2. Nginx安装与启动
        (1) 解压Nginx压缩包
            
        (2) 双击nginx.exe启动Nginx,在浏览器输入http://localhost展示如下页面即表示安装成功
            
     3. Tomcat集群
        (1) 解压apache-tomcat-7.0.69.zip成两个tomcat1、tomcat2
                                           
        (2) 修改tomcat1的配置文件conf/server.xml            
            1). 修改server的port端口为18005
                 

            2). 修改Connector的port端口为18080
                 

            3). 修改<Connector port="18009"protocol="AJP/1.3" redirectPort="8443" />
                 

            4). 修改Engine添加jvmRoute="tomcat"
               

            5). 在<Engine>下添加如下配置文件
                              

            
[XML] 纯文本查看 复制代码

<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="localhost" port="14000" 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"/>
      <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
      <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

        (3) tomcat2操作同上,修改位置参照tomcat1,修改tomcat2的配置文件conf/server.xml
             1). 修改server的port端口为28005
                  同tomcat1修改server的port端口
             2). 修改Connector的port端口为28080
                  同tomcat1修改Connector的port
             3). 修改<Connector port="28009"protocol="AJP/1.3" redirectPort="8443" />
                  同tomcat1修改操作
             4). 修改Engine添加jvmRoute="tomcat"
                  同tomcat1该操作
             5). 在<Engine>下添加如下配置文件           
                  同tomcat1的该操作
        (4) 修改Nginx安装目录下conf/nginx.conf文件
              
            
    4. 创建Web项目并测试广播机制的session共享
        (1) 创建一个Web项目,名称为TestJQ
              
        (2) 编辑index.jsp的内容如下
            
        (3) 在WEB-INF下的web.xml中加入<distributable/>
            
        (4) 将该web项目分部复制到tomcat1和tomcat2的webapps目录下
        (5) 分别修改tomcat1和tomcat2下web项目的index.jsp内容如下
            
            
        (6) 启动tomcat1和tomcat2
        (7) 在Nginx安装目录下,进入cmd命令模式执行如下命令
            
        (8) 测试,在浏览器输入http://localhost/TestJQ。不断刷新该页面,session如果保持不变则完成广播机制的Nginx+tomcat集群下的session共享

       注意:依靠广播方式来实现的session复制,会浪费很多带宽导致整个网络反映缓慢。官网也建议这种方式最好不要超过4台tomcat!推荐使用下面方式实现,当然如果是分布式架构。那么应该考虑sso单点登录系统来使用redis模拟session机制

二.Nginx+tomcat集群+redis实现session共享
1. 环境准备
        
    2. Nignx的配置信息参照上面的,无序做任何修改
    3. 修改tomcat如下内容
       (1). 将tomcat1和tomcat2目录下conf/server.xml文件中的<Engine>节点中的jvmRoute属性去掉           
       (2). 删除tomcat1和tomcat2目录下conf/server.xml文件中的<Cluster> ... </Cluster>节点
       (3). 删除tomcat1和tomcat2的webapps下TestJQ项目的web.xml,去掉<distributable/>节点   
    4. Redis的安装
      
(1) 解压redis压缩包
            
       (2) 启动redis,在redis安装目录下,进入cmd命令窗口执行启动命令
           ----64位redis启动命令:redis-server.exe redis.windows.conf
           ----32位redis启动命令:redis-server.exe Redis.conf
   

    5. tomcat使用redis实现session共享
      
(1) 解压如下压缩包,并将解压后的所有jar拷贝到tomcat1和tomcat2的lib目录下
            
       (2) 修改tomcat1和tomcat2下conf/context.xml配置文件,加入以下内容
[XML] 纯文本查看 复制代码

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
                  host="localhost"
                  port="6379"
                  database="0"
                  maxInactiveInterval="60" />

    6. 重启redis和Nginx服务,启动tomcat1和tomcat2。在浏览器输入http://localhost/TestJQ。不断刷新该页面,session如果保持不变则实现Nginx+tomcat集群+redis实现session共享

三.总结
这里只是简单的整理Nginx反向代理实现tomcat集群中的session共享,对于集群、负载均衡做一个入门案例。让大家对如今互联网行业面临的问题有一个大概的了解,当然随着我们的学习,我们会更加深入集群、分布式架构、SOA、各种微服务等技术!
      希望这篇文章对大家有所帮助,也希望我们共同进步,共同探讨新技术,不断提升!
      不发展的技术只会淘汰,不学习的人才终会沉沦!Let's rock and control it , come on

nginx-1.8.0.zip

1.22 MB, 下载次数: 527

Redis32.zip

558.06 KB, 下载次数: 401

redis64-2.8.17.zip

1.31 MB, 下载次数: 437

tomcat-redis-session.rar

386.86 KB, 下载次数: 474

TestJQ.rar

976 Bytes, 下载次数: 429


作者: 盖碗茶    时间: 2017-9-5 13:09

作者: 成都校区    时间: 2017-9-5 13:14
给力给力
作者: 钟佩桓    时间: 2017-9-5 13:34
写的很有技术含量!非常不错!
作者: hua1586981    时间: 2017-11-11 15:49
使用nginx搭建集群tomcat8,redis实现session共享,文件共享问题:http://blog.csdn.net/hua1586981/article/details/78132710
作者: 小飞不会飞    时间: 2018-5-17 15:47
已收藏




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2