对于高访问量、高并发量的网站或web应用来讲,目前最多见的解决方案应该就是利用负载均衡进行server集群,例如比较流行的nginx+memcache+tomcat。集群以后好比咱们有N个Tomcat,用户在访问咱们的网站时有可能第一次请求分发到tomcat1下,而第二次请求又分发到了tomcat2下,有过web开发经验的朋友都知道这时session不一致会致使怎样的后果,因此咱们须要解决一下多个tomcat之间session共享的问题。css
首先咱们须要下载tomcat,这里咱们选择tomcat7的解压缩版:html
下载完成后咱们新建一个目录叫tomcat_cluster(tomcat集群的意思),直接解压下载好的tomcat,并重命名为tomcat1,能够看到目录结构以下:java
准备一个最简单的web项目(在IDE中建立部署,拷贝出来便可),并修改index.jsp的内容以下:nginx
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> SessionID:<%=session.getId()%> <BR> SessionIP:<%=request.getServerName()%> <BR> SessionPort:<%=request.getServerPort()%> <% out.println("This is Tomcat Server 11111"); %> </body> </html>
这样基本工做就作完了,下面须要修改tomcat的配置文件,咱们打开conf下的server.xml文件,找到下面这一行:web
<Engine name="Catalina" defaultHost="localhost">
不须要作任何修改,在这一行的下面加入以下代码:apache
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <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="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" 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=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
这个就是tomcat自带的集群配置了,咱们能够在tomcat官方文档中的cluster-howto.html中看到相关注意事项,其中有一条须要注意一下:浏览器
Make sure your web.xml
has the <distributable/>
elementtomcat
很明显是说咱们的web项目的web.xml文件中须要有<distributable/>这个元素,因此在咱们刚才引入的web项目中作如上的修改。session
这样咱们的基本配置就完成了,由于是集群,因此在tomcat_cluster目录下拷贝一份tomcat1,并重命名成tomcat2。并发
注意一下须要修改的地方:
一、首先确定是端口号,全部port字样的配置都修改一下保证两个不重复,我这里将tomcat1的端口修改成7080,tomcat2的端口修改成9080。
二、修改webapps下的项目中的index.jsp文件,由于要测试session共享因此有必要区分一下,在jsp中加入一行静态文本便可,我这里是用“This is Tomcat Server 111111”和“This is Tomcat Server 22222”来进行区分的,下面分别启动两个tomcat进行测试,咱们分别运行bin目录下的startup.bat,发现第一个tomcat启动以后,第二个没法启动,这是由于启动脚本(startup.bat)没有修改,引用一样的CATALINA_HOME必然会报错,因此请注意下面的第三点。
三、为咱们的这两个tomcat添加两个环境变量——CATALINA_HOME二、CATALINA_HOME3分别指向这两个tomcat的安装目录:
而后分别修改两个tomcat中bin目录下的两个脚本:startup.bat和catalina.bat,把tomcat1中的这两个文件中的%CATALINA_HOME%替换为%CATALINA_HOME2%,把tomcat2中的这两个文件中的%CATALINA_HOME%替换为%CATALINA_HOME3%,如今再启动tomcat,会发现两个tomcat均可以正常启动了,解压版的tomcat须要这样配置一下。在浏览器中检测一下tomcat是否能够成功访问:
OK,再访问一下咱们的测试项目,看看session是否一致:
能够发现咱们两个tomcat下的这两个项目Session彻底一致,刷新也不会变,到此为止咱们就算成功实现了Session共享,也就是说咱们tomcat已经成功完成了任务,剩余的交给nginx就OK了。最后再强调一下,这两个testdemo的web.xml中须要加这么元素:
介绍了tomcat集群以前的必备工做——session共享的配置,以及同时启动两个tomcat解压缩版须要注意的问题,但愿对看到的同窗有所帮助吧,The End。