tomcat总结二(Apache+Tomcat集群配置详解)
下面我们在一台机器上配置一个Apache和两个Tomcat服务器集群:1.准备:Apache? Tomcat? JK插件,下载地址详见:http://lishaofengstar.blog.163.com/blog/static/131972852201212694624295/2.安装Apache,安装两个Tomcat,并把一个测试项目放到两个Tomcat的webapps目录下以便以后测试。3.把mod_jk.so复制到<apache_home>/modules下。4.在<apache_home>/conf目录下创建:workers.properties文件:
6.3另外,如果两台Tomcat服务器装在一台机器上,必须确保他们的端口没有冲突,Tomcat中一共配置了三个端口:<Server port="8005" shutdown="SHUTDOWN"><Connector port="8080" .../><Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />把其中一个该了让它们不一样就行了。?完成了以上步骤我们的集群算是基本完成了,打开Apache和两个Tomcat 浏览器进入:localhost/demo/ 能够正确访问。为了测试,我们写一个jsp文件:test.jsp
<html>
<head><title>test</title></head><body>????<%????????System.out.printfln("call test.jsp");????%>????session:<%=session.getId() %></body></html>
?
把它放到两个Tomcat中的demo项目中,浏览器访问这个页面,每次访问只在一个Tomcat控制台打印语句。?然而页面中的Session Id是会变的。这种情况下如果一个用户正在访问时,如果跳到另一个Tomcat服务器,那么他的session就没有了,可能导致错误。?7.配置集群管理器如果读者对HttpSession有了解应该知道,用户的会话状态保存在session中,一个浏览器访问多个网页它们的请求始终处于一个会话范围中,因此SessionID应该是不变的。以上我们看到的浏览器中的SessionID不同,因为转到另一个Tomcat后当前会话就结束了,又在另一个服务器上开启了一个新的会话。那么怎么让多个Tomcat服务器共享一个会话呢?为了解决上述问题,我们启用Tomcat的集群管理器(SimpleTcpCluster):7.1修改Tomcat1和Tomcat2的servlet.xml文件,在Engine元素中加入以下Cluster元素<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster"????????????channelSendOptions="8">?????????<ManagerclassName="org.apache.catalina.ha.session.DeltaManager"????????expireSessionsOnShutdown="false"????????notifyListenersOnReplication="true"/>?????????<ChannelclassName="org.apache.catalina.tribes.group.GroupChannel">????????????<MembershipclassName="org.apache.catalina.tribes.membership.McastService"????????????????????????bind="127.0.0.1"??????????????????????? address="228.0.0.4"??????????????????????? port="45564"??????????????????????? frequency="500"??????????????????????? dropTime="3000"/>????????????????<ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"????????????????????? address="auto"????????????????????? port="4000"????????????????????? autoBind="100"????????????????????? selectorTimeout="5000"????????????????????? maxThreads="6"/>????????????<SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">????????????????<TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>????????????</Sender>????????????<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>????????????<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>????????</Channel>?????????<ValveclassName="org.apache.catalina.ha.tcp.ReplicationValve"filter=""/>????????<ValveclassName="org.apache.catalina.ha.session.JvmRouteBinderValve"/>?????????<DeployerclassName="org.apache.catalina.ha.deploy.FarmWarDeployer"??????????????????? tempDir="/tmp/war-temp/"??????????????????? deployDir="/tmp/war-deploy/"??????????????????? watchDir="/tmp/war-listen/"??????????????????? watchEnabled="false"/>????????<ClusterListenerclassName="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>????????<ClusterListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener"/>????????</Cluster>?关于Cluster的相关介绍参照:<tomcat-home>\webapps\docs\cluster-howto.html? <tomcat-home>\webapps\docs\config\cluster.html7.2分别修改Tomcat1和Tomcat2 demo项目的web.xml文件,在后面加入<distributable>元素<web-app>...<distributable/></web-app>如果一个web项目的web.xml文件中指定了<distributable/>元素那么Tomcat服务器启动这个Web应用时,会为它创建由<Cluster>元素指定的会话管理器,这里我们用的是DeltaManager,他们把会话从一个Tomcat服务器复制到集群中另一个Tomcat服务器。7.3重新启动两个Tomcat,发现Tomcat控制台还是依次打印出Call test.jsp 页面中的SessionID却不变了。测试完成。重要说明:(1).如果项目要发布到集群上,那么与会话有关的类需要实现java.io.Serializable序列化接口。(2).集群中Tomcat间用组播方式进行通信,如果机器上有多个网卡则可能导致组播失败,解决的办法是<Cluster>元素的<Membership>元素配置bind属性,它用于明确知道组播地址:<Membership className="org.apache.catalina.tribes.membership.McastService"?bind="127.0.0.1".../>(3).如果集群较小,可以采用DeltaManager会话管理器,如果多的话建议使用BackupManager(4).<Membership>的address设为"228.0.0.4",运行时须确保机器联网能访问到该地址,否则可能运行失败。