Apache+Tomcat+JK 实现集群、负载均衡

    技术2026-05-04  3

    Apache+Tomcat+JK 实现集群、负载均衡

    1.         软件说明

    apache_2.2.10-win32-x86-no_ssl.msi

    mod_jk-1.2.27-httpd-2.2.10.so

    jakarta-tomcat-5.5.9 

    (注: windows xp 系统)

    2.           配置

    一、             负载均衡

    1.       安装 apche,tomcat

    http://httpd.apache.org/   下载 Apache

    http://tomcat.apache.org/ 下载 Tomcat

    http://tomcat.apache.org/download-connectors.cgi 下载 JK

    这里使用的都是 windows 下的版本。

    安装 Apache Tomcat,

    将下载的 mod_jk-1.2.27-httpd-2.2.10.so 文件复制到 apache 安装目录 modules 目录

     

    2.       修改 Apache 配置文件

    apache 安装目录下 conf 目录中找到 http.conf ,在文件最后加上下面一句:

    http.conf

     

    # 指定 mod_jk 配置文件的位置

    Include conf/mod_jk.conf

     

    conf 目录中新建 mod_jk.conf 文件,内容如下:

    mod_jk.conf

     

    # 加载 mod_jk Module

    LoadModule jk_module modules/mod_jk-1.2.27-httpd-2.2.10.so

    # 指定 workers.properties 文件路径

    JkWorkersFile  conf/workers.properties

    # url 请求的配置文件路径

    JkMountFile conf/uriworkermap.properties

     

    接着在 conf 目录下新建 workers.properties 文件,内容如下:

    workers.properties

     

    worker.list=controller # server 列表,分发控制器 注意不要放 tomcat 实例

    # Tomcat1 实例配置 这里要和 Tomcat 配置文件 service.xml jvmRoute 保持一致  

    worker.tomcat1.port=8009 #ajp13 端口号,在 tomcat server.xml 配置 , 默认 8009

    worker.tomcat1.host=localhost # tomcat 的主机地址,如不为本机,请填写 ip 地址

    worker.tomcat1.type=ajp13

    worker.tomcat1.lbfactor = 1 # server 的加权比重,值越高,分得的请求越多

    # Tomcat2 实例配置

    worker.tomcat2.port=9009

    worker.tomcat2.host=localhost

    worker.tomcat2.type=ajp13

    worker.tomcat2.lbfactor = 1

     

    # 负载均衡分发控制器

    worker.controller.type=lb

    worker.controller.balanced_workers=tomcat1,tomcat2  # 指定分担请求的 tomcat

    worker.controller.sticky_session=false  # 关闭 粘性 session( 默认是 true 打开的 )

     

    接着在 conf 目录下新建 uriworkermap.properties 文件,内容如下:

    uriworkermap.properties

     

    # 指定那些请求交给 tomcat 处理 ,"controller" 为在 workers.propertise 里指定的负载分配控制器

    /*.jsp=controller

     

     

    3.       修改 tomcat 配置文件

    修改 tomcat conf 目录下的 server.xml 文件。如果你在不同电脑上安装 tomcat,tomcat

    的安装数量为一个,可以不必修改 tomcat 配置文件,我这里是在同一台电脑上安装两

    tomcat ,所以需要更改其中一个的设置打开 tomcat2/conf/server.xml 文件:

     

     

     

     

     

    4.       编写测试项目 test

    test.jsp

     

    <%    System.out.println("==========================="); %>

    test 放到 tomcat1,tomcat2 webapps 下的 test 应用中

    5.       启动 apache tomcat 进行测试

    通过 http://localhost/test/test.jsp   访问,查看 tomcat1 的窗口,可以看到打印了一行

    "============" ,再刷新一次, tomcat2 也打印了一条,再刷新,可以看到请求会被 tomcat1,tomcat2 轮流处理 , 实现了负载均衡

     

     

     

    二、             配置集群

    只配置负载均衡还不行,还要 session 复制,也就是说其中任何一个 tomcat 的添加

    session ,是要同步复制到其它 tomcat 集群内的 tomcat 都有相同的 session

     

    1.       修改 tomcat1, tomcat2 server.xml

    将集群部分配置的在注释符删掉 , 并将 tomcat2 4001 端口改为 4002 ,以避免与

    tomcat 冲突,当然,如果是两台电脑,是不用改端口的,去掉注释符即可

     

     

     

     

     

     

    Engine 标签中添加 jvmRoute=’tomcat1’ jvmRoute 名称必须和 worker.properties 中的 tomcat 实例名称一致,不然无法实现 session_stricky( 粘性 session) 。同时还要将 apache/conf/workers.properties 文件中 worker.controller.sticky_session=true

     

     

     

    2.       修改测试项目 test

    修改 test.jsp 内容如下:

    test.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.print("<b>Session 列表</b>");

      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="index.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>

     

    然后在 test 新建 WEB-INF 目录, WEB-INF 下新建 web.xml, 内容如下:

    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>TestDemo</display-name>        <distributable/> </web-app>

     

    web.xml 配置文件加上 <distributable/> 节点,此配置说明当前 Web 工程处于分布式部署环境。如果不进行这个配置,每次访问页面 tomcat 都会产生一个新的 sessionid

     

    3.       测试

    test 应用复制到 tomcat1,tomcat2 webapps 下,重启 apache,tomcat1,tomcat2

    输入网址 http://localhost/test/test.jsp    ,表单输入 songsp , 值为 test session, 提交查询,        Tomcat1 处理请求。如下图:

     

           Tomcat1 服务关闭。在输入 bbbb,aaaaa 提交,由于 Tomcat1 关闭, Tomcat2 来处理请求,并且 session 同步的。如下图:

    最新回复(0)