apache+tomcat 负载及session复制

1、windows下apache安装

    (1) 下载:

        官网:http://httpd.apache.org/download.cgi

        windows版:http://www.apachelounge.com/download/

    (2) 安装:

        解压到本地,修改配置文件(\config\httpd.conf)。

        配置文件修改:

            将配置文件里所有的“c:/Apache24”替换为本地的路径,比如ServerRoot、DocumentRoot属性等。

 #ServerRoot "c:/Apache24"
 ServerRoot "E:/soft/Apache24"

            端口默认是80,如果被占用,可以修改“Listen 80”

 #Listen 80
 Listen 81

    (3) 启动服务:

        打开 /bin 目录下的 ApacheMonitor.exe,服务管理工具。默认打开在右下角图标,第一次打开里面是空的,没有服务。

        运行 –> cmd –> 到 /bin 目录下,输入httpd -k install 添加服务,ApacheMonitor 中会加入一个 service。

        点击 [start] 启动服务,启动成功后到浏览器,输入“http://localhost:端口/”出现 “It works” 则启动成功。

        注:如果 [start] 的时候报错,可以通过命令 httpd -k start 启动服务并查看报错信息,以及到 /logs 里面查看错误日志。

 

2、配置负载

    在配置文件的末尾,添加

 ProxyRequests Off
 <Proxy balancer://proxy>
     #BalancerMember http://localhost:8080
     #BalancerMember http://localhost:8081
     # ajp是apache和tomcat的一种协议,效率优与http
     BalancerMember ajp://localhost:8009
     BalancerMember ajp://localhost:8010
 </Proxy>
 <VirtualHost *:81>
     # 第一个 / 代表 apache访问的路径
     # balancer://proxy 表示使用上面那个代理配置
     # 末尾补一个 / ,因为proxy里面配置的路径最后没有加 / ,如果加了这里就不用加了,比如:http://localhost:8080/
     ProxyPass / balancer://proxy/
     ProxyPassReverse / balancer://proxy/
 </VirtualHost>

    启动以下模块(在配置文件中默认都有,只需要把注释去掉就行):

 LoadModule proxy_module modules/mod_proxy.so  
 LoadModule proxy_balancer_module modules/mod_proxy_balancer.so  
 LoadModule proxy_http_module modules/mod_proxy_http.so
 LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
 LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
 LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
 LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so

    负载的权重:

 <Proxy balancer://proxy>
     # 每三次访问,访问两次8009,访问一次8010
     # loadfactor是权重,默认是1。
     BalancerMember ajp://localhost:8009 loadfactor=2
     BalancerMember ajp://localhost:8010 loadfactor=1
     # lbmethod表示负载载均衡策略。
     # byrequests 按次数均衡(默认),bytraffic 按照流量均衡、bybusyness 按繁忙度均衡 
     ProxySet lbmethod=byrequests
 </Proxy>

    重启apache测试一下。

 

3、session复制

    (1) 绑定 jvmRoute(可以不配,配完了比较方便测试,sessionId里面会加上这个名字,便于观察访问的那个服务器)

    修改tomcat中的server.xml文件,在 Engine 中加入 jvmRoute 属性。

 <Engine defaultHost="localhost" name="Catalina"  jvmRoute="tocmat_1">
     ......
 </Engine>

    修改apache的配置,在 BalancerMember 中加入 route 参数。

 BalancerMember ajp://localhost:8009 loadfactor=2 route=tomcat_1

 

    (2) 配置session复制

    在项目的web.xml中加入 distributable 元素,告诉服务器,这个项目是分布式的

 <web-app …>
     ......
     <distributable />
 </web-app>

    修改apache配置文件,在 ProxyPass 中加入 stickySession 和 noFailOver 参数。

 ProxyPass / balancer://proxy/ stickySession=JSESSIONID noFailOver=On

    修改tomcat中的server.xml文件,在 Engine 中加入 Cluster 元素。

        最简单的方式,去掉配置中的注释就可以了:

 <Engine defaultHost="localhost" name="Catalina"  jvmRoute="tocmat_1">
     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      ......
 </Engine>

        复杂一点的方式:

 <Engine defaultHost="localhost" name="Catalina"  jvmRoute="tomcat_1">
     <Cluster
             channelSendOptions="8"
             className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
         <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="224.0.0.0"
                      port="45564"
                      frequency="500"
                      ropTime="3000" />
             <Receiver
                      className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="5000"
                      selectorTimeout="100"
                      tcpListenAddress="127.0.0.1"
                      tcpListenPort="4000"
                      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=".*\.ico;.*\.gif;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.js;.*\.txt;" />
         <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve" />
         <Deployer
                  className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                  deployDir="/tmp/war-deploy/"
                  tempDir="/tmp/war-temp/" watchDir="/tmp/war-listen/"
                  watchEnabled="false" />
         <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" />
         <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
     </Cluster>
     ......
 </Engine>

     说明:

         Membership 元素的 address 属性表明的是广播的地址。

         Receiver 元素绑定了本机 tcp 通讯的地址。

         Valve 元素中的 filter 属性表明那些元素可以忽略 session 复制,降低开销。

 

4、其它说明:

    (1) 对于 linux 系统,广播的号段是默认关闭的,必须通过命令开启。windows下是默认开放的,不用特殊处理。

    (2) 我用的是 apache 2.4 的版本,在每次刚开始连接的时候,非常慢,但是连上以后就很快了,查了一下,可以在 apache 配置中加入两个参数来解决

 AcceptFilter http none
 AcceptFilter https none

    (3) 我在自己写的项目中测试,发现在频繁的 session 操作时,有的时候会出现复制不成功的情况,然后两个服务器的 session 就乱了,sessionId就一直变,然后 tcp 的错。

 Unable to receive message through TCP channel
 java.lang.IllegalArgumentException: Session id mismatch, not executing the delta request

         自己调试了很久,感觉是session复制的时间差导致的,比如:访问 A服务器注册 session,成功后立即跳到 B服务器取 session(比如登录后回到主页),在取得时候session还没有复制过来,结果就乱了。具体是不是这个原因,还有待确定,做了延时等尝试,都没有完全解决,后续还得具体研究。         

你可能感兴趣的:(apache,负载,session复制)