Apache2.2.11+Tomcat6.0.20集群配置

Apache2.x和Tomcat配置可以采用反向代理的方式(mod proxy),也可以采用JK模块,最终采用了JK模块,JK模块的效率要比反向代理高,这是Apache官方网站上说的,我没有测试过。JK配置虽然复杂,但更加灵活。
首先,下载Apache2.2.11,Tomcat6.0.20解压版,以及mod_jk-1.2.28-httpd-2.2.3.so
安装Apache服务器,将mod_jk-1.2.28-httpd-2.2.3.so重命名为mod_jk.so并拷贝到Apache安装目录下的modules文件夹中。
在Apache2.2安装目录的conf文件夹下,建立以下3个文件:
mod_jk.conf、workers.properties、uriworkermap.properties
在httpd.conf最后加上:

Java代码 复制代码
  1. # JK module settings   
  2. Include conf/mod_jk.conf  
# JK module settings Include conf/mod_jk.conf

表示将mod_jk.conf配置文件包含进来,以下是mod_jk.conf文件的内容:

Java代码 复制代码
  1. # Load JK Module   
  2. LoadModule jk_module modules/mod_jk.so   
  3.   
  4. # Configure mod_jk   
  5. JkWorkersFile conf/workers.properties   
  6. JkMountFile conf/uriworkermap.properties   
  7. JkShmFile logs/mod_jk.shm   
  8. JkLogFile logs/mod_jk.log   
  9. JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories   
  10. JkLogLevel warn   
  11. JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"  
  12. HostnameLookups Off   
  13.   
  14. <Location /jkmanager/>   
  15.     JkMount jkstatus   
  16.     Order deny,allow   
  17.     Deny from all   
  18.     Allow from 127.0.0.1  
  19. </Location>  
# Load JK Module LoadModule jk_module modules/mod_jk.so  # Configure mod_jk JkWorkersFile conf/workers.properties JkMountFile conf/uriworkermap.properties JkShmFile logs/mod_jk.shm JkLogFile logs/mod_jk.log JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories JkLogLevel warn JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" HostnameLookups Off  <Location /jkmanager/>     JkMount jkstatus     Order deny,allow     Deny from all     Allow from 127.0.0.1 </Location>

 接下来配置workers.properties文件:

Java代码 复制代码
  1. # environment slash for Windows(反斜杠代表Windows系统)   
  2. ps=\   
  3.   
  4. worker.retries=3  
  5.   
  6. # 此处定义了一个负载均衡器和状态监视器   
  7. worker.list=loadbalancer,jkstatus   
  8.   
  9. worker.tomcatA.type=ajp13   
  10. worker.tomcatA.host=localhost   
  11. worker.tomcatA.port=9001  
  12. worker.tomcatA.lbfactor=1  
  13. worker.tomcatA.connection_pool_timeout=600  
  14. worker.tomcatA.socket_keepalive=true  
  15. worker.tomcatA.socket_timeout=60  
  16.   
  17. worker.tomcatB.type=ajp13   
  18. worker.tomcatB.host=localhost   
  19. worker.tomcatB.port=9002  
  20. worker.tomcatB.lbfactor=1  
  21. worker.tomcatB.connection_pool_timeout=600  
  22. worker.tomcatB.socket_keepalive=true  
  23. worker.tomcatB.socket_timeout=60  
  24.   
  25. worker.tomcatC.type=ajp13   
  26. worker.tomcatC.host=localhost   
  27. worker.tomcatC.port=9003  
  28. worker.tomcatC.lbfactor=1  
  29. worker.tomcatC.connection_pool_timeout=600  
  30. worker.tomcatC.socket_keepalive=true  
  31. worker.tomcatC.socket_timeout=60  
  32.   
  33. worker.jkstatus.type=status   
  34.   
  35. worker.loadbalancer.type=lb   
  36. worker.loadbalancer.sticky_session=true  
  37. worker.loadbalancer.sticky_session_force=false  
  38. worker.loadbalancer.balance_workers=tomcatA,tomcatB,tomcatC  
# environment slash for Windows(反斜杠代表Windows系统) ps=\  worker.retries=3  # 此处定义了一个负载均衡器和状态监视器 worker.list=loadbalancer,jkstatus  worker.tomcatA.type=ajp13 worker.tomcatA.host=localhost worker.tomcatA.port=9001 worker.tomcatA.lbfactor=1 worker.tomcatA.connection_pool_timeout=600 worker.tomcatA.socket_keepalive=true worker.tomcatA.socket_timeout=60  worker.tomcatB.type=ajp13 worker.tomcatB.host=localhost worker.tomcatB.port=9002 worker.tomcatB.lbfactor=1 worker.tomcatB.connection_pool_timeout=600 worker.tomcatB.socket_keepalive=true worker.tomcatB.socket_timeout=60  worker.tomcatC.type=ajp13 worker.tomcatC.host=localhost worker.tomcatC.port=9003 worker.tomcatC.lbfactor=1 worker.tomcatC.connection_pool_timeout=600 worker.tomcatC.socket_keepalive=true worker.tomcatC.socket_timeout=60  worker.jkstatus.type=status  worker.loadbalancer.type=lb worker.loadbalancer.sticky_session=true worker.loadbalancer.sticky_session_force=false worker.loadbalancer.balance_workers=tomcatA,tomcatB,tomcatC

上述配置文件中,sticky_session=true,sticky_session_force=false。很多文章建议,前者设置为true时,后者也设置为true。

实际上,负载均衡和集群复制是两个概念。在Tomcat的集群复制中,分为DeltaManager和BackupManager两种,前者适合于小型系统,任何情况下,均进行Session复制,消耗大量资源。所以,我们应该采用BackupManager,仅在需要的时候(Tomcat挂掉的时候)进行Session复制。

sticky_session=true表示某个请求始终由当前Tomcat处理,不会转移到其他Tomcat上。sticky_session_force=false表示,当前Tomcat挂掉的时候,自动将Session复制到其他Tomcat上。如果将sticky_session_force设置为true,当你关闭一台Tomcat并刷新网页,将得到503错误。但设置为false,关闭一台Tomcat并刷新网页,被关闭的那台Tomcat上的Session会被自动复制到其他Tomcat上,系统继续正常运行。

再来看uriworkermap.properties文件,这个文件是用来定义哪些资源由Tomcat处理,哪些资源由Apache处理。

Java代码 复制代码
  1. /*.jsp=loadbalancer   
  2. /*.action=loadbalancer   
  3. /jkmanager/*=jkstatus   
  4.   
  5. !*.gif=loadbalancer   
  6. !*.jpg=loadbalancer   
  7. !*.png=loadbalancer   
  8. !*.bmp=loadbalancer   
  9. !*.css=loadbalancer   
  10. !*.js=loadbalancer   
  11. !*.htm=loadbalancer   
  12. !*.html=loadbalancer   
  13. !*.swf=loadbalancer  
/*.jsp=loadbalancer /*.action=loadbalancer /jkmanager/*=jkstatus  !*.gif=loadbalancer !*.jpg=loadbalancer !*.png=loadbalancer !*.bmp=loadbalancer !*.css=loadbalancer !*.js=loadbalancer !*.htm=loadbalancer !*.html=loadbalancer !*.swf=loadbalancer

上述配置文件将jsp和action交给负载均衡器处理,实际上就是Tomcat,其他请求由Apache处理。如果你用!/*.gif=loadbalancer,图片可能会不显示,正确设置虚拟目录即可。或者使用!*.gif=loadbalancer,代表所有gif图片均交给Apache处理。

 

接下来,配置Tomcat的配置文件。Tomcat6解压后,server.xml和Tomcat5相比,少很多注释的内容,所以需要到Tomcat5的server.xml文件中拷贝过来,然后去掉注释。

需要修改的端口:

SHUTDOWN、HTTP/1.1、AJP/1.3、Receiver 4001,如果是同一台机器,确保上述端口均不同。

3台Tomcat的jvmRoute需要同workers.properties中的一致

Java代码 复制代码
  1. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA">   
  2. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatB">   
  3. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatC">  
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA"> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatB"> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatC">

 以下是集群配置内容(Tomcat6的server.xml中没有相应的注释代码,必须从Tomcat5的里面复制过来,再修改一下):

Java代码 复制代码
  1. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  
  2.                channelSendOptions="6">   
  3.   
  4.         <Manager className="org.apache.catalina.ha.session.BackupManager"  
  5.                  expireSessionsOnShutdown="false"  
  6.                  notifyListenersOnReplication="true"  
  7.                  mapSendOptions="6"/>   
  8.         <!--   
  9.         <Manager className="org.apache.catalina.ha.session.DeltaManager"  
  10.                  expireSessionsOnShutdown="false"  
  11.                  notifyListenersOnReplication="true"/>   
  12.         -->   
  13.         <Channel className="org.apache.catalina.tribes.group.GroupChannel">   
  14.           <Membership className="org.apache.catalina.tribes.membership.McastService"  
  15.                       bind="127.0.0.1"  
  16.                       address="228.0.0.4"  
  17.                       port="45564"  
  18.                       frequency="500"  
  19.                       dropTime="3000"/>   
  20.           <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"  
  21.                     address="127.0.0.1"  
  22.                     port="4001"  
  23.                     selectorTimeout="100"  
  24.                     maxThreads="6"/>   
  25.   
  26.           <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">   
  27.             <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>   
  28.           </Sender>   
  29.           <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>   
  30.           <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>   
  31.           <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>   
  32.         </Channel>   
  33.   
  34.         <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  
  35.                filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>   
  36.   
  37.         <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>   
  38.       </Cluster>  
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"                channelSendOptions="6">          <Manager className="org.apache.catalina.ha.session.BackupManager"                  expireSessionsOnShutdown="false"                  notifyListenersOnReplication="true"                  mapSendOptions="6"/>         <!--         <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"                       bind="127.0.0.1"                       address="228.0.0.4"                       port="45564"                       frequency="500"                       dropTime="3000"/>           <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"                     address="127.0.0.1"                     port="4001"                     selectorTimeout="100"                     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"/>           <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>         </Channel>          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"                filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>       </Cluster>

注意:这里要使用BackupManager,不要使用DeltaManager。3台Tomcat的Receiver端口要设置为不一样的。

接下来,要进行Session复制,还需要给你的web.xml配置文件中加一行<distributable/>。这样很麻烦,改变Tomcat的content.xml配置文件就可以了,修改19行为<Context distributable="true">

大功告成,先启动Apache,然后分别启动几个Tomcat。

在浏览器上输入http://localhost/test.jsp

在一个Tomcat设置Session的内容,然后刷新,通过观察后台窗口,会发现Session一直粘在这台Tomcat上,然后关闭掉这台Tomcat,继续刷新页面,会发现Session里面的内容自动转移到了另外一台Tomcat上面。如果你将sticky_session_force设置为false,此时刷新页面,就会报503错误。

对uriworkermap.properties还有一些模糊,加了/后就代表相对路径,不加代表绝对匹配,我用*.jsp,居然报404找不到页面的错误。用/*.jsp就正常了,我没有设置任何虚拟目录。而图片的配置刚好相反,加了斜杠就不显示,去掉就可以显示了。想不通啊!

以下是测试用的test.jsp

Java代码 复制代码
  1. <%@ page contentType="text/html; charset=GBK" %>         
  2. <%@ page import="java.util.*" %>         
  3. <html><head><title>Cluster App Test</title></head>         
  4. <body>         
  5. <%           
  6.     System.out.println("SessionID:"  + session.getId());          
  7. %>         
  8. Server Info:          
  9. <%          
  10. out.println(request.getServerName() + " : " + request.getServerPort()+"<br>");%>         
  11. <%          
  12.    out.println("<br> ID " + session.getId()+"<br>");   // 如果有新的 Session 属性设置          
  13.    String dataName = request.getParameter("dataName");          
  14.    if (dataName != null && dataName.length() > 0) {          
  15.       String dataValue = request.getParameter("dataValue");          
  16.       session.setAttribute(dataName, dataValue);          
  17.    }          
  18.    out.print("<b>Session 列表</b><br>");            
  19.    Enumeration e = session.getAttributeNames();          
  20.    while (e.hasMoreElements()) {          
  21.       String name = (String)e.nextElement();          
  22.       String value = session.getAttribute(name).toString();          
  23.       out.println( name + " = " + value+"<br>");          
  24.           System.out.println( name + " = " + value);          
  25.     }          
  26. %>         
  27.   <form action="test.jsp" method="POST">         
  28.      名称:<input type=text size=20 name="dataName">         
  29.      <br>         
  30.      数值:<input type=text size=20 name="dataValue">         
  31.      <br>         
  32.     <input type=submit>         
  33.   </form>         
  34. </body>         
  35. </html> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值