您的位置:首页 > 运维架构 > Tomcat

Apache2.2.11+Tomcat6.0.20集群配置

2016-06-06 09:33 423 查看
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] view
plain copy

# JK module settings  

Include conf/mod_jk.conf  

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

[java] view
plain copy

# 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] view
plain copy

# 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] view
plain copy

/*.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] view
plain copy

<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的里面复制过来,再修改一下):

[html] view
plain copy

<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

[html] view
plain copy

<%@ page contentType="text/html; charset=GBK" %>        

<%@ page import="java.util.*" %>        

<html><head><title>Cluster App Test</title></head>        

<body>        

<%          

    System.out.println("SessionID:"  + session.getId());         

%>        

Server Info:         

<%         

out.println(request.getServerName() + " : " + request.getServerPort()+"<br>");%>        

<%         

   out.println("<br> ID " + session.getId()+"<br>");   // 如果有新的 Session 属性设置         

   String dataName = request.getParameter("dataName");         

   if (dataName != null && dataName.length() > 0) {         

      String dataValue = request.getParameter("dataValue");         

      session.setAttribute(dataName, dataValue);         

   }         

   out.print("<b>Session 列表</b><br>");           

   Enumeration e = session.getAttributeNames();         

   while (e.hasMoreElements()) {         

      String name = (String)e.nextElement();         

      String value = session.getAttribute(name).toString();         

      out.println( name + " = " + value+"<br>");         

          System.out.println( name + " = " + value);         

    }         

%>        

  <form action="test.jsp" method="POST">        

     名称:<input type=text size=20 name="dataName">        

     <br>        

     数值:<input type=text size=20 name="dataValue">        

     <br>        

    <input type=submit>        

  </form>        

</body>        

</html>  

  转载请标明出处 http://blog.csdn.net/shimiso 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: