linux Apache+jk+tomcat集群配置

最近在学习apache集群搭建,这里是我搭建进群的心得。

一:环境

     系统:linux(红帽)

     apache : httpd-2.2.3.tar.gz 

    连接器mod_jk : tomcat-connectors-1.2.43-src

    tomcat : apache-tomcat-8.0.48这里在同一台机器上,复制两个

    jdk : jdk1.8.0_151

二:安装软件

   Apache安装在此就不介绍了,,可以参照:https://blog.csdn.net/sunxiaofeng_sdn/article/details/80278740

    1,mod_jk安装。

         # tar -zxvf tomcat-connectors-1.2.43-src.tar.gz 

         #cd tomcat-connectors-1.2.43-src/native

         # ./configure--with-apxs=/usr/local/apache/bin/apxs

         # make

         # make install

         最后将tomcat-connectors-1.2.43-src/apache-2.0下的mod_jk.so文件拷贝到apache安装目录下的modules文件夹下面。

     # cp ./apache-2.0/mod_jk.so   /usr/local/apache/modules/


    2,tomcat

         这里把tomcat复制两个,分别为tomcat1,tomcat2

         修改分别修改tomcat1和tomcat2中server.xml中的端口,防止端口冲突。

         tomcat1中server.xml三个端口如下:

         

                        connectionTimeout="20000"

               redirectPort="8443" />

         

         tomcat2中server.xml三个端口如下:

         

                        connectionTimeout="20000"

               redirectPort="8443" />

         

         最后分别启动两个tomcat,并且可以正常访问。

        apache目录:/usr/local/apache

       tomcat1目录:/usr/local/tomcat1

       tomcat2目录:/usr/local/tomcat2

      mod_jk目录:/usr/local/tomcat-connectors-1.2.43-src

三:配置

         1,配置httpd.conf

           #vim /usr/local/apache/conf/httpd.conf

           在文件中添加如下代码:

               #加载mod_jk Module

               LoadModule jk_module modules/mod_jk.so
               
               #指定workers.properties文件路径
               JkWorkersFile /usr/local/apache/conf/workers.properties
               #指定jk logs文件存放位置
               JkLogFile /usr/local/apache/logs/mod_jk.log
               #Set the jk log level [debug/error/info]
               JkLogLevel info
               #Select the log format
               JkLogStampFormat "[%a %b %d%H:%M:%S %Y]"
               #JkOptions indicate to send SSL KEYSIZE,
               JkOptions  +ForwardKeySize +ForwardURICompat -ForwardDirectories
               #JkRequestLogFormat set the requestformat
               JkRequestLogFormat "%w %V %T %q %U%R"
               #JkShmFile to put logs
               JkShmFile /usr/local/apache/logs/mod_jk.shm 
               JKMount /TEST* controller

             

       

           #指定哪些请求交给tomcat处理,哪些请求交给apache处理

           #注意:" controller"为在workers.propertise里指定的负载分配控制器

           JkMount /TEST controller#所有的TEST下的请求都交给tomcat处理

 

       2,创建workers.properties并编辑

          #touch workers.properties

          编辑 vim workers.properties添加如下内容:

# workers 列表

worker.list=controller

#--------------------------------------------------------------------

# 第一个tomcat

#--------------------------------------------------------------------

worker.tomcat1.port=8091   #对应tomcat的server.xml中配置的ajp13端口号

worker.tomcat1.host=localhost  #tomcat1的主机地址,如不为本机,请填写IP地址

worker.tomcat1.type=ajp13  #定向包协议

worker.tomcat1.lbfactor=1  #server的负载分配权重,值越高,分得的请求越多

#以下为非必要配置,这部分配置tomcat2的配置同tomcat1

#worker.tomcat1.cachesize=1000  #配置tomcat的jk连接缓存大小 (非必要)

#worker.tomcat1.cachesize_timeout=600  # (非必要)

#worker.tomcat1.reclycle_timeout=300  # (非必要)

#worker.tomcat1.socket_keepalive=1  #防止防火墙切断未激活的网络连接(非必要)

#worker.tomcat1.socket_timeout=300   #(非必要)

#worker.tomcat1.local_worker=1  # (非必要)

#worker.tomcat1.retries=3  # (非必要) 

#----------------------------------------------------------------------

# 第二个tomcat

#----------------------------------------------------------------------

worker.tomcat2.port=8092

worker.tomcat2.host=localhost  #tomcat2的主机IP地址

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor=1

#----------------------------------------------------------------------

# load controller-负载均衡控制器

# ---------------------------------------------------------------------

worker.controller.type=lb

worker.controller.balanced_workers=tomcat1,tomcat2  #指定分担请求的tomcat

worker.controller.sticky_session=true    #设置为粘性session

worker.controller.sticky_session_force=false  #设置当多次请求未响应,请求将转发

worker.status.type=status

三:测试

    创建一个web项目,项目名称为TEST,然后创建一个index.jsp,分别部署在tomcat1中和tomcat2中

   tomcat1中index.jsp如下:

    linux Apache+jk+tomcat集群配置_第1张图片

    tomcat2中index.jsp如下:

   linux Apache+jk+tomcat集群配置_第2张图片

   然后重启,Apache和tomcat1,tomcat2

   访问Apache如下图所示(我的Apache端口81):

    linux Apache+jk+tomcat集群配置_第3张图片

    再刷新一下

   linux Apache+jk+tomcat集群配置_第4张图片

     此时tomcat分发已经大功告成了,但是大家发现sessionId不一样,说明session没有共享,接下来我们介绍session如何共         享。

     课外,单纯转发tomcat:

      此时如果只是用来Apache转发tomcat的话已经可以了,只不过不需要添加到到负载均衡控制器中。

      比如:现在有一个tomcat3,ajp端口是8093. 项目是TEST2,需要修改配置如下:

      在httpd.conf中添加

       JKMount /TEST2*  tomcat3

      在workers.properties添加

      worker.list=controller,tomcat3

      worker.tomcat3.port=8092

      worker.tomcat3.host=localhost  #tomcat2的主机IP地址

      worker.tomcat3.type=ajp13

      worker.tomcat3.lbfactor=1

    这样访问http://localhost:81/TEST2/login.jsp就可以了,注意一定不要网控制器中加,因为这只是转发,不是集群。

四:session共享配置

      1,首先修改tomcat中server.xml文件配置

            tomcat1:修改如下:

             设置jvmRoute名称,这个名称和workers.properties文件中work.后面的名称一致

             jvmRoute="tomcat1">

            最后去掉两边的注释。

          tomcat2:修改如下(和tomcat区别在于jvmRoute):

              设置jvmRoute名称,这个名称和workers.properties文件中work.后面的名称一致

              jvmRoute="tomcat2">

             最后去掉两边的注释。

             注:session管理器:

             DeltaManager:集群下某个节点创建、改动的Session,都将复制到其他节点,每个节点部署的应用要一样。这个管                                    理器是tomcat默认的集群配置,适用于一般的小型集群。

              BackupManager:集群下产生的所有Session都将放到一个备份节点,集群下的所有节点都可以访问此备份节点,每                                     个节点部署的应用 可以不一样。

          具体,查看tomcat官网。

 2,设置distributable

          在tomcat中context.xml添加属性distributable="true"

          <Context distributable="true">

         或者

        在项目web.xml 中前面添加<distributable/>

        注:这个标签是进行session复制所必须的,否则不能进行seeeion复制。

   3,设置session粘性

          worker.controller.sticky_session=true    #设置为粘性session

          worker.controller.sticky_session_force=false  #设置当多次请求未响应,请求将转发

说明: 

 worker.controller.sticky_session,设置为1或true使用粘着session,设置为0或false不使用粘着session。如果sticky_session设为true时,建议sticky_session_force设为false,此参数表明如果集群中某台服务器在多次请求没有响应后,将转发当前的请求到其它服务器上处理;sticky_session_force=true时,影响比较大,会导致转发到其它服务器上的请求,找不到原来的session,所以如果此时请求中有读取session中某些信息的话,就会导致应用的null异常。sticky_session、sticky_session_force的默认值分别为true,false。

worker.controller.sticky_session=false,提交页面,将按照负载均衡的规则切换服务器,实现“完全的负载均衡”,代价是Tomcat不停交换session数据,慢;

worker.controller.sticky_session=true,提交页面将仍使用同一服务器(session建立在哪就用哪台),不能保证完完全全的负载均衡,但相对能省频繁切换服务器的代价。可能会变上面的快一些。所有请求始终转发到session创建的服务器上。  

         sticky_session   sticky_session_force             含义 

           true                          false            SESSION会复制,有粘性 

           true                          true             SESSION不复制,有粘性 

           false                         false            SESSION会复制,无粘性 

           false                         true             SESSION会复制,无粘性  

     4,验证session共享

          验证一:

             worker.controller.sticky_session=true 

             worker.controller.sticky_session_force=false 

            结果:第一次访问时tomcat2服务器,添加session值tomcat2=2后请求还是tomcat2,之后刷新一直是此服务器。

           linux Apache+jk+tomcat集群配置_第5张图片

           停掉tomcat2服务,再刷新页面结果如下:

           linux Apache+jk+tomcat集群配置_第6张图片

           这时候可以看到,请求访问到了tomcat1,同事session值也复制了。

           验证二:

             worker.controller.sticky_session=true 

             worker.controller.sticky_session_force=true

             结果:第一次访问时tomcat1服务,添加session值tomcat1=1后请求还是tomcat1,之后刷新一直是此服务器。

             linux Apache+jk+tomcat集群配置_第7张图片

            停掉tomcat1服务,然后刷新页面结果如下:

           linux Apache+jk+tomcat集群配置_第8张图片

            结果,并没有重新转发到tomcat2上,关闭浏览器重新打开或清除缓存,重新请求结果如下:  

          linux Apache+jk+tomcat集群配置_第9张图片

           可以访问到tomcat2上。

     验证三:

             worker.controller.sticky_session=false

             worker.controller.sticky_session_force=false

             结果:第一次访问时tomcat1服务,添加session值tomcat1=1后请求转发到tomcat2,之后刷新会根据负载负载权重进               行分配。

             linux Apache+jk+tomcat集群配置_第10张图片

               上图可以看出把tomcat1中添加的session值复制到了Tomcat2了,此时我们添加tomcat2=2,提交结果如下:

               linux Apache+jk+tomcat集群配置_第11张图片

             此时转发到tomcat1服务上了,同时也复制了tomcat2添加到session中的值tomcat2=2.

            注:具体请求到那个服务上是根据配置的权重进行分配的,不一定是交替

       验证四:

             worker.controller.sticky_session=false

             worker.controller.sticky_session_force=true

            结果:验证结果和验证三一致。




你可能感兴趣的:(Apache)