Apache + MOD

    技术2022-05-19  18

    Apache + MOD_JK + TOMCAT实现集群和负载均衡配置指南 

    对于Web应用的集群学习我是从Tomcat5.5开始的,下面是我的实际操作过程和一些体会。

    第一部分 环境介绍

    负载均衡

    ×××××××××××××××××

       操作系统:windows xp

       IP地址   :192.168.1.200

       Apache:apache_2.2.13-win32-x86-openssl-0.9.8k.msi

     mod_jk:mod_jk-1.2.28-httpd-2.2.3.so(for windows)

    集群环境Tomcat1

    ×××××××××××××××××

       操作系统:SUSE Linuxe server 10

       IP地址   :192.168.1.114

       Tomcat :apache-tomcat-5.5.28

    集群环境Tomcat2

    ×××××××××××××××××

       操作系统:SUSE Linuxe server 10

       IP地址   :192.168.1.113

       Tomcat :apache-tomcat-5.5.28

    第二部分 负载均衡配置

      第一步:安装apache,安装目录为C:/Apache2.2。

      第二步:将mod_jk-1.2.28-httpd-2.2.3.so文件复制到目录%apache_home%/modules目录下

      第三步:修改配置文件%apache_home%/conf/httpd.conf

                  在文件%apache_home%/conf/httpd.conf的最末尾增加如下行:include conf/mod_jk.conf

     

    view plain copy to clipboard print ? #zhangzk    include conf/mod_jk.conf   #zhangzk include conf/mod_jk.conf

     第四步:在目录%apache_home%/conf下面创建文件mod_jk.conf

     

    view plain copy to clipboard print ? #加载mod_jk Module    LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.3.so   #    #指定 workers.properties文件路径    JkWorkersFile conf/workers.properties   #    #指定哪些请求交给tomcat处理    #"controller"为在workers.propertise里指定的负载分配控制器名        JkMount /*.jsp controller   #加载mod_jk Module LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.3.so # #指定 workers.properties文件路径 JkWorkersFile conf/workers.properties # #指定哪些请求交给tomcat处理 #"controller"为在workers.propertise里指定的负载分配控制器名 JkMount /*.jsp controller

    第五步:在目录%apache_home%/conf下创建文件workers.properties

     

    view plain copy to clipboard print ? #server        worker.list = controller        #========tomcat1========        worker.tomcat1.port=8009     worker.tomcat1.host=192.168.1.114       worker.tomcat1.type=ajp13       worker.tomcat1.lbfactor = 1       #========tomcat2========       worker.tomcat2.port=8009       worker.tomcat2.host=192.168.1.113       worker.tomcat2.type=ajp13       worker.tomcat2.lbfactor = 1          #========controller,负载均衡控制器========         worker.controller.type=lb       worker.controller.balanced_workers=tomcat1,tomcat2   worker.controller.sticky_session=1   #server worker.list = controller #========tomcat1======== worker.tomcat1.port=8009 worker.tomcat1.host=192.168.1.114 worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor = 1 #========tomcat2======== worker.tomcat2.port=8009 worker.tomcat2.host=192.168.1.113 worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor = 1 #========controller,负载均衡控制器======== worker.controller.type=lb worker.controller.balanced_workers=tomcat1,tomcat2 worker.controller.sticky_session=1

               至此负载均衡服务器已经配置完毕啦。

               分别启动tomcat1和tomcat2已经apache就可以实现对于*.jsp的请求进行1:1分发到tomcat1和tomcat2上。

    第三部分 tomcat集群配置

                第一步:将%tomcat_home%/conf/server.xml文件中的集群配置节点的注释去掉

                            即将该文件中如下部分

     

    view plain copy to clipboard print ? <!--    <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"              managerClassName="org.apache.catalina.cluster.session.DeltaManager"              expireSessionsOnShutdown="false"              useDirtyFlag="true"              notifyListenersOnReplication="true" >         ......    </Cluster>    -->      <!-- <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster" managerClassName="org.apache.catalina.cluster.session.DeltaManager" expireSessionsOnShutdown="false" useDirtyFlag="true" notifyListenersOnReplication="true"> ...... </Cluster> -->

                         修改为如下形式(......表示中间有代码段没有展示出来)

    view plain copy to clipboard print ? <Cluster className= "org.apache.catalina.cluster.tcp.SimpleTcpCluster"             managerClassName="org.apache.catalina.cluster.session.DeltaManager"             expireSessionsOnShutdown="false"             useDirtyFlag="true"             notifyListenersOnReplication="true" >        ......   </Cluster>   <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster" managerClassName="org.apache.catalina.cluster.session.DeltaManager" expireSessionsOnShutdown="false" useDirtyFlag="true" notifyListenersOnReplication="true"> ...... </Cluster>

                   上述变更在集群环境tomcat1和tomcat2上都需要同样的处理。

     

                第二步:将%tomcat_home%/conf/server.xml文件中的如下代码作出变更            

                >>>集群环境Tomcat1

     

    view plain copy to clipboard print ? <Engine name= "Catalina"  defaultHost= "localhost" >   <Engine name="Catalina" defaultHost="localhost">

                修改为

     

    view plain copy to clipboard print ? <Engine name= "Standalone"  defaultHost= "localhost"  jvmRoute= "tomcat1" >   <Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1">

                >>> 集群环境Tomcat2

     

    view plain copy to clipboard print ? <Engine name= "Catalina"  defaultHost= "localhost" >   <Engine name="Catalina" defaultHost="localhost">

                修改为

     

    view plain copy to clipboard print ? <Engine name= "Standalone"  defaultHost= "localhost"  jvmRoute= "tomcat2" >   <Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat2">

               第三步:

               在需要部署到Tomcat中的web应用程序的WEB-INFO/web.xml中增加如下代码

     

    view plain copy to clipboard print ? <distributable/>   <distributable/>

              经过上述3大步骤Tomcat的集群配置就完成啦。

              在WEB应用程序中当对session.setAttribute(arg1,arg2)方法进行操作的时候,就可以完成Session的复制了。

     

      第4部分 注意事项  

             在普通的Web应用程序中如下代码片段即可完成Session中属性的变更

     

    view plain copy to clipboard print ? Object o = request.getSession( true ).getAttribute(LOGIN_USER_INFO_KEY);   UserInfo ui = (UserInfo) o;   ui.setAccessPageCount(ui.getAccessPageCount() + 1);   Object o = request.getSession(true).getAttribute(LOGIN_USER_INFO_KEY); UserInfo ui = (UserInfo) o; ui.setAccessPageCount(ui.getAccessPageCount() + 1);

             但是在集群部署环境下该处理是不能完成Session复制的,必须用如下代码片段才可以

     

    view plain copy to clipboard print ? Object o = request.getSession( true ).getAttribute(LOGIN_USER_INFO_KEY);   UserInfo ui = (UserInfo) o;   ui.setAccessPageCount(ui.getAccessPageCount() + 1);   request.getSession().setAttribute(LOGIN_USER_INFO_KEY, ui);  

     


    最新回复(0)