最新文章:

首页 Ops

Apache和Tomcat实现集群和负载均衡

发布时间:2016年06月16日 评论数:抢沙发 阅读数:3748

    一、 环境说明 
    Windows XP 
    apache_2.0.59-win32-x86-no_ssl.msi      http://httpd.apache.org/ 
    mod_jk-apache-2.0.59.so                http://tomcat.apache.org/download-connectors.cgi 
    apache-tomcat-5.5.23.zip    http://tomcat.apache.org/download-55.cgi 

    我的程序分别安装到 
    D:\webserver\Apache Group\Apache2 
    D:\webserver\TomcatCluster\tomcat1 
    D:\webserver\TomcatCluster\tomcat2 

    Apache安装完后,在右下角状态栏中可以看到 Apache Service Monitor 可以控制Apache的状态。 
    验证Apache是否安装成功,可以访问http://localhost 如果能看到Apache的预制页面,说明安装成功,如果不行,可以访问http://localhost:8080 试试(可能因为IIS已经使用了80端口, 我的就是8080, 可以修改Apache的配置文件来修改) 

    二、 负载均衡 
    找到Apache安装目录下conf目录中的httpd.conf文件。 
    在文件最后添加一句: 
    include "D:\webserver\Apache Group\Apache2\conf\mod_jk.conf" 

    接着在conf目录中新建文件mod_jk.conf并添加下面的内容: 
    #加载mod_jk Module 
    LoadModule jk_module modules/mod_jk-apache-2.0.59.so 
    #指定 workers.properties文件路径 
    JkWorkersFile conf/workers.properties 
    #指定哪些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名 
    JkMount /*.jsp controller 

    在conf目录下新建workers.properties文件并添加如下内容: 
    #server 
    worker.list = controller 
    #========tomcat1======== 
    worker.tomcat1.port=11009 
    worker.tomcat1.host=localhost 
    worker.tomcat1.type=ajp13 
    worker.tomcat1.lbfactor = 1 
    #========tomcat2======== 
    worker.tomcat2.port=12009 
    worker.tomcat2.host=localhost 
    worker.tomcat2.type=ajp13 
    worker.tomcat2.lbfactor = 1 

    #========controller,负载均衡控制器======== 
    worker.controller.type=lb 
    worker.controller.balanced_workers=tomcat1,tomcat2 
    worker.controller.sticky_session=1 

    (解释一下AJP13是 Apache JServ Protocol version 1.3) 

    将mod_jk-apache-2.0.59.so 复制到Apache的modules目录中。 

    接下来配置2个Tomcat 
    打开tomcat1\conf\ server.xml 
    将Server port 改为11005 
    <Server port="11005" shutdown="SHUTDOWN"> 

    将Define Connector port改为11080 
    <Connector port="11080" maxHttpHeaderSize="8192" 

    将AJP13 Connector port改为11009 
    <Connector port="11009"  enableLookups="false" redirectPort="8443" protocol="AJP/1.3" /> 

    打开tomcat2\conf\server.xml 
    将Server port 改为12005 
    <Server port="12005" shutdown="SHUTDOWN"> 

    将Define Connector port改为12080 
    <Connector port="12080" maxHttpHeaderSize="8192" 

    将AJP13 Connector port改为12009 
    <Connector port="12009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" /> 

    好了,现在建立一个测试程序 
    分别在两个Tomcat的webapps中建立test目录,并新建test.jsp文件,内容如下: 
    <% 
    System.out.println("==========="); 
    %> 

    启动apache, tomcat1, tomcat2 
    访问http://localhost:8080/test/test.jsp (或者 http://localhost/test/test.jsp)不断刷新页面,可以在两个Tomcat的控制台中看到,交替输出"===========", 这样就实现了负载均衡。 


    三、 集群配置 
    集群除了负载均衡,另一个主要功能是Session Replication。 
    打开tomcat1\conf\ server.xml将<Cluster>部分的注释去掉。 
    再打开tomcat2\conf\ server.xml将<Cluster>部分的注释也去掉,并将<Cluster>中<Receiver>的tcpListenPort的值改为4002。以避免与Tomcat1冲突。 

    添加一个新的测试程序test2.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="test2.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> 

    分别在2个tomcat的webapps\test中新建WEB-INF目录,在WEB-INF中添加web.xml内容如下: 
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> 
           <display-name>TomcatDemo</display-name> 
           <distributable/> 
    </web-app> 

    主要是添加<distributable/>,distributable元素用来告诉servlet容器,程序将部署在分布式Web容器中。 
    重新启动tomcat1和tomcat2. 访问http://localhost:8080/test/test2.jsp (或http://localhost/test/test2.jsp) 
    随意添加key-value, 可以看到两个tomcat交替显示session中的值,各个tomcat的session是同步的。 

    再来修改tomcat1\conf\server.xml,找到 
    <Engine name="Catalina" defaultHost="localhost"> 
    为其添加jvmRoute属性,值为apache的conf\workers.properties中配置的tomcat名字。 
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> 

    同样修改tomcat2\conf\server.xml的相同部分 
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2"> 

    jvmRoute是tomcat路由标示,由此区分两台tomcat主机。一次会话,就有一个sessionID,这个sessionID后面会跟上jvmRoute设置的值,这样一次会话,就只会让一个tomcat处理。 

    重新启动tomcat1, tomcat2 
    访问http://localhost:8080/test/test2.jsp 可以看到session.getId()的值在原session id后面多了jvmRoute的值。 
    ID 46A5843FF4A1E0A84338225AC02F6430.tomcat1 
    随意添加key-value,可以看到session信息只在tomcat1中输出。 

    再打开一个浏览器,并访问http://localhost:8080/test/test2.jsp 其session id可能变为 
    ID 11478E5BE5FE388E4845205B4133A30F.tomcat2 
    其值也只会在tomcat2中输出。 

    现在把tomcat1关闭,再次刷新访问tomcat1的那个浏览器,可以看到session信息输出到了tomcat2的控制台中,并且session信息仍然保留着。
二维码加载中...
本文作者:Mr.linus      文章标题: Apache和Tomcat实现集群和负载均衡
本文地址:http://www.90qj.com/366  本文已经被百度收录,点击查看详情
版权声明:若无注明,本文皆为“挨踢 Blog”原创,转载请保留文章出处。
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
提交评论

清空信息
关闭评论