• apache tomcat集群


    今天花了大概两个小时完毕了tomcat与apache的集群。现记录一下,也希望能帮助后来者。


    建议看这篇博客前,先阅读一下鄙人拙作 tomcat整合apache 
    看完那个后,再进行集群,就非常快了。


    和之前 tomcat整合apache中的一样,这次集群用的软件版本号例如以下:
    jdk 7 ,tomcat 6.0.44,apache2.2.4,mod_jk的版本号是1.2.26。


    配置apache

    更改apache下的httpd.conf

    先把listen 80改成listen 81或者别的,大家都知道,80这个port常常被占用的。
    在最后一行添上
    include "C:Program Files (x86)Apache Software FoundationApache2.2confmod_jk.conf"
    之后 在conf文件夹下再建立一个mod_jk.conf,写上
    LoadModule jk_module modules/mod_jk.so
    JkWorkersFile conf/workers.properties
    #指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名
    JkMount /*.jsp controller
    假设看完了我之前的那个博客,mod_jk的内容就非常easy理解了。


    大家看到conf/workers.properties这行代码了,非常easy,相对路径conf下建立workers.properties

    #server
    worker.list = controller
    #========tomcat1========
    worker.tomcat1.port=18009
    worker.tomcat1.host=localhost
    worker.tomcat1.type=ajp13
    worker.tomcat1.lbfactor = 1
    #========tomcat2========
    worker.tomcat2.port=28009
    worker.tomcat2.host=localhost
    worker.tomcat2.type=ajp13
    worker.tomcat2.lbfactor = 1
    #========tomcat3========
    worker.tomcat3.port=38009
    worker.tomcat3.host=localhost 
    worker.tomcat3.type=ajp13
    worker.tomcat3.lbfactor = 1
     
    #========controller,负载均衡控制器========
    worker.controller.type=lb
    worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3
    worker.controller.sticky_session=false
    worker.controller.sticky_session_force=1
    #worker.controller.sticky_session=1
    OK搞定

    lbfactor是干什么的?

    假设tomcat1,tomcat2,tomcat3的lbfactor各自是2,5,4那么全部的请求中2/11会分配给tomcat1处理,5/11会给tomcat2....



    配置tomcat

    改动port

    在这里,我先说明一点,一个tomcat有三个port#各自是支持http1.1的connectorport,支持ajp1.3的connectorport与tomcat的Serverport#分别例如以下:
     <Connector port="8080" protocol="HTTP/1.1" 
                   connectionTimeout="20000" 
                   redirectPort="8443" />
    	       .......
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
     .......
    <Server port="8005" shutdown="SHUTDOWN">
    普通情况下,我们修改的都是8080,也就是支持http1.1协议的这端口。
    今天的情况是,我们须要在一台机器上,执行三个tomcat,那么这个三个tomcat共9个port就得所有不一样。
    另外,在workers.properties里面的worker.tomcat3.port=38009这个port也指的是tomcat的ajpport。

    我们有3个tomcat,最好就放到一起吧,例如以下



    首先改动那9个port号,为了清晰,tomat1的三个port各自是18080,18009,18005,其余两个类似

    改动engine

    改动每一个tomcat下server.xml中的engine,后面加上jvmRoute="tomcat1",当然tomcat2下的jvmRoute就是tomcat2了,注意这个tomcat1,tomcat2与workers.properties中的那个得相应。
     <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

    加上Cluster

    这个,事实上不须要又一次写,在engine的以下,cluster本来是被凝视掉的,去掉凝视就可以
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

    改动web.xml

    将一个javaweb项目复制三份,分别放到各个tomcat/webapps下,然后改动每一个项目的web.xml
    给web-app根文件夹下加上以下一行,让这个项目支持集群。
    <distributable/>


    測试

    在每一个project的根文件夹下加上一个jsp(这个jsp来自网络上)
    mytest.jsp
    <%@ page contentType="text/html; charset=GBK" %>
    <%@ page import="java.util.*" %>
    <html><head><title>Cluster App Test</title></head>
    <body>
    Server Info:
    <%
    out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<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.println("<b>Session 列表</b><br>");
      System.out.println("============================");
      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="mytest.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://localhost:81/PathTest/mytest.jsp


    刷新几下,添上名称与值 能看到以下的页面:






    OK,session在三个tomcat中统一了,集群搞定


    几个问题

    1 本来有3个tomcat,我们关闭当中一个后,假如是tomcat2,那么之后我们再刷新mytest.jsp的时候,就会发现就仅仅有tomcat1与tomcat3在处理请求了。OK,这是符合我们推測的。等我们又一次启动tomcat2后,再刷新,发现请求还是没有发到tomcat2中#假设我们又一次启一个session(就是再开一个浏览器)发现请求在三个tomcat中又能循环处理了#
     这说明,tomcat的请求分发机制是:对于某个session,先检查有哪些tomcat能够处理,第一次有三个,那么就用这三个处理;假设某次检查的时候,发现某个tomcat不能用了,那就让session记住它,请求以后就不给那个tomcat了,即使后面这个tomcat又能用了,依然不给他 说白了,你拒绝我一次,我tm以后都不找你了!可是另起一个session后,两个浏览器就都OK了#能够理解为:"听我姐妹说,你能够,那么就再给你一次机会喽"~~~~

     以上为charyle的理解。详细评述见http://www.iteye.com/topic/1017961


    2 大家不要忘记,我在PathTest这个项目里,还有几个带图片的jsp,大家看看
    http://localhost:81/PathTest/jsp/a.jsp
    我们訪问,这个地方,找不到图片
    怎么办?


    把mod_jk改成以下的样子。

    LoadModule jk_module modules/mod_jk.so
    JkWorkersFile conf/workers.properties
    
     # 设置虚拟主机,定义port为81
     <VirtualHost 127.0.0.1:81>
         ServerName 127.0.0.1
         DocumentRoot "E:/cluster/tomcat1/webapps"
         #定义站点项目所在路径,把路径指向 tomcat 中的默认站点文件夹
         DirectoryIndex index.html index.htm index.jsp
         ErrorLog logs/shsc-error_log.txt
         #指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名
    JkMount /*.jsp controller
    
    
     </VirtualHost>
    
    
    


    关于VirtualHost还有总体的apache的配置,我不是非常清楚,总之上面这样的配置能解决找不到jpg的问题。

    ///////////下面是2016-8-16日改动

    非常羞愧,发现大家用的都是tomcat8或tomcat7,我这还是6,可是也懒得再去升级了

    大家看这个博客吧:

    http://blog.csdn.net/flyliuweisky547/article/details/21293071

    上面的是tomcat8与apache的集群

    假设tomcat要把session放到redis里,再看看以下这博客

    http://blog.csdn.net/caiwenfeng_for_23/article/details/45666831

    ///////////以上是2016-8-16日改动

    參考资料

    http://www.iteye.com/topic/1017961
  • 相关阅读:
    新学期的合作
    软件工程问题及回答
    《程序猿的生命周期》阅读有感
    《构建之法》13~17章
    阅读《构建之法》十一、十二、十三章之感
    阅读《构建之法》十一、十二、十三章
    【.NET / C#】SubarrayUtils(查找子数组工具类)
    【Java】ComplexTimerTask (TimerTask 拓展封装)
    【Java】AesCbcCodec(AES_CBC加解密工具类)
    【Java】AesEcbCodec(AES_ECB加解密工具类)
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7397094.html
Copyright © 2020-2023  润新知