Chinaunix首页 | 论坛 | 博客
  • 博客访问: 172963
  • 博文数量: 33
  • 博客积分: 761
  • 博客等级: 上士
  • 技术积分: 364
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-15 23:56
个人简介

梦想主义者

文章分类

全部博文(33)

文章存档

2012年(33)

分类: Java

2012-02-06 10:24:45

最近学习了tomcat的集群配置,也在网上看了一些配置,现总结如下:

 

一、需要下载并安装相应的软件。包括

Apache 2.2   

       Tomcat-6

       mod_jk-1.2.31-httpd-2.2.3.so

二、修改相应的配置文件:

1、复制mod_jk-1.2.31-httpd-2.2.3.soapachemodules目录下

2、修改apache安装目录下conf目录下的httpd.conf

去掉下面几行前的#(注释符)号,可以让apache在启动时自动加载代理(proxy)模块(这几行相邻)

LoadModule proxy_module modules/mod_proxy.so
       LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
       LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
       LoadModule proxy_connect_module modules/mod_proxy_connect.so
       LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
       LoadModule proxy_http_module modules/mod_proxy_http.so

 

3、向下拉动文档找到节点,在DirectoryIndex index.html后加上index.jsp,这一步只是为了待会配置完tomcat后能看到小猫首页,可以不做。

继续下拉文档找到Include conf/extra/httpd-vhosts.conf,去掉前面的注释符。

继续下拉文档找到Include conf/extra/httpd-mpm.conf,去掉前面的注释符。

4打开conf/extra/httpd-vhosts.conf,配置虚拟站点,在最下面加上如下节点

    ServerAdmin webmaster@dummy-host.czs.gov.cn

    DocumentRoot "D:\chenzhouMH\WebRoot"

    ServerName

    ServerAlias localhost

    ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On

    ProxyPassReverse / balancer://cluster/

    ErrorLog "logs/test -error.log"

    CustomLog "logs/test -access.log" common

这里balancer://是告诉Apache需要进行负载均衡的代理,后面的cluster是集群名,可以随意取,两个日志引擎ErrorLog负责记录错误,CustomLog负责记录所有的http访问以及返回状态,日志名可以自己取,现取为testhttpd-vhosts.conf配置完毕,回到httpd.conf,在文档最下面加上如下的内容和节点

ProxyPass / balancer://cluster/ lbmethod=byrequests stickysession=JSESSIONID nofailover=Off  timeout=30 maxattempts=3 

ProxyPassReverse / balancer://cluster/

    BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=jvm1

    BalancerMember ajp://127.0.0.1:9009 loadfactor=1 route=jvm2

用于配置工作在tomcat集群中的所有节点,这里的"cluster"必须与上面的集群名保持一致。Apache通过ajp协议与tomcat进行通信,ip地址和端口唯一确定了tomcat节点和配置的ajp接受端口。loadfactor是负载因子,Apache会按负载因子的比例向后端tomcat节点转发请求,负载因子越大,对应的tomcat服务器就会处理越多的请求,如两个tomcat都是1Apache就按11的比例转发,如果是21就按21的比例转发。route参数对应后续tomcat配置中的引擎路径(jvmRoute)。

5、在apache安装目录下增加conf/jk目录,在此目录下新建mod_jk.conf文件,文件内容是:

 

#加载mod_jk Module

LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so   

#指定 workers.properties文件路径

JkWorkersFile conf/jk/workers.properties 

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

JkMountFile conf/jk/uriworkermap.properties 

JkLogFile logs/mod_jk.log 

JkShmFile logs/mod_jk.shm 

JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" 

JkRequestLogFormat "%w %V %T" 

JkMount /* controller

继续在这个目录下新建uriworkermap.properties文件,文件内容如下:

/*=controller 

#!/*.gif=controller 

#!/*.jpg=controller 

#!/*.png=controller 

#!/*.css=controller 

#!/*.js=controller 

#!/*.htm=controller 

#!/*.html=controller 

/jkstatus=status

 

感叹号表示接下来的 URI 不要由 JK 进行处理,也就是 Apache 直接处理所有的图片、css 文件、js 文件以及静态 html 文本文件

 

继续在此目录下新建workers.properties文件,文件内容如下:

worker.list = controller,status,jvm1,jvm2  

worker.template.type=ajp13 

worker.template.ping_mode=A 

worker.template.ping_timeout=20000 

worker.template.connection_pool_size=2048 

worker.template.socket_keepalive=true 

worker.template.socket_connect_timeout=20000 

worker.jvm1.reference=worker.template 

worker.jvm1.port=8009 

worker.jvm1.host=127.0.0.1    

worker.jvm2.reference=worker.template 

worker.jvm2.port=9009 

worker.jvm2.host=127.0.0.1

worker.controller.type=lb 

worker.controller.balanced_workers=jvm1,jvm2

worker.controller.sticky_session=false 

worker.status.type=status 

worker.status.read_only=true

 

6、修改httpd-mpm.conf文件,在apache安装目录下的conf/extra目录下:

MinSpareServers 5  允许最小的空闲进程

       MaxSpareServers 10 允许最大的空闲进程

       StartServers 5  HTTP服务启动时创建的http进程数量

       ServerLimit 4000 使得无须重编译Apache就可以加大MaxClients

 

       MaxClients 150这个是服务器最大连结数,如果超过150联结的话系统就有等待情况,如果繁忙的话150是不够的

       MaxRequestsPerChild 0  这个建立设置10000apache避免程序有异常,定义一个子进程完成多少个请求以后退出,如果是0就是永远不退出。如果对自己程序比较难把我的话建议设置一个稍大的值而不是0

三、tomcat的配置

首先要将tomcat解压为两份,一个为tomcat1,另一个为tomcat2。如果在同一台机器上使用,tomcat1尽量不要改动,只需改动tomcat2即可。如果在不同机器上运行,则不需要对tomcat的端口进行改动。

1、  配置关闭端口:

Tomcat1不变,tomcat2port改为9005

       2、配置connector端口:

               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

               enableLookups="false" redirectPort="8443" acceptCount="100"

               connectionTimeout="20000" disableUploadTimeout="true" />

tomcat1不变,tomcat2改为9080

       3、配置AJP 1.3 Connector

               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

tomcat1不变,tomcat2改为9009。注意,这里的端口对应Apache httpd.confBalancerMember中配置的ajp连接端口。

       4继续向下配置引擎,找到,去掉这段或改为注释,把上方紧挨的注释符去掉,对于tomcat2,去掉注释符并把jvm1改为jvm2。这里的jvmRoute对应Apache httpd.confBalancerMember中配置的route参数。

注:此时测试时并不能轮流访问tomcat,但如果把tomcat1的jvmRoute改为jvm2,tomcat2的jvmRoute改为jvm1就可以轮流访问了。不过不知道为什么这样设定,盼高手解答。。。。

      

5Tomcat内存配置:在bin目录下找到catalina.bat文件,在些文件中加入一行代码:set JAVA_OPTS=-Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

      6、讲以下代码的注释去掉:

至此,server.xml的配置修改完毕。

       四、web项目的配置

D盘下新建test目录,在test目录下新建test.jsp,源代码如下:

  1. <%@ page contentType="text/html; charset=GBK" %>
  2. <%@ page import="java.util.*" %>
  3. <html><head><title>Cluster App Test</title></head>
  4. <body>
  5. Server Info:
  6. <%
  7. out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"
    "
    );%>
  8. <%
  9.   out.println("
    ID "
    + session.getId()+"
    "
    );
  10.   String dataName = request.getParameter("dataName");
  11.   
  12.   if (dataName != null && dataName.length() > 0) {
  13.      String dataValue = request.getParameter("dataValue");
  14.      session.setAttribute(dataName, dataValue);
  15.   }
  16.   
  17.   out.print("Session 列表");
  18.   
  19.   Enumeration e = session.getAttributeNames();
  20.   
  21.   while (e.hasMoreElements()) {
  22.      String name = (String)e.nextElement();
  23.      String value = session.getAttribute(name).toString();
  24.      out.println( name + " = " + value+"
    "
    );
  25.          System.out.println( name + " = " + value);
  26.    }
  27. %>
  28.   <form action="test.jsp" method="POST">
  29.     名称:<input type=text size=20 name="dataName">
  30.      <br>
  31.     值:<input type=text size=20 name="dataValue">
  32.      <br>
  33.     <input type=submit>
  34.    </form>
  35. </body>
  36. </html>


test目录下新建WEB-INF目录,在WEB-INF目录下新建web.xml,代码如下:

       xmlns:xsi="" version="2.4"

       xsi:schemaLocation="  /web-app_2_4.xsd">

      

      

      

 

最后将这个web项目部署到tomcat上。分别在tomcat1tomcat2server.xml文件中的Host节点内(即上的一行)增加如下的一行:  docBase="D:\test" />

到此全部的配置就都已结束。启动apache,分别启动tomcat1tomcat2,在浏览器中输入如下的地址:(或者将localhost替换为127.0.0.1

输入对应的名称和值进行提交,可以发现提交时两个tomcat在交替处理。

在配置自己的项目时,可以在tomcat的server.xml文件的Host节点结束前添加如下代码:

此处的path是指输入url时的地址,docBase是指项目所在的实际位置(注意要写到项目的WebRoot目录下)。



写在最后的话:对于tomcat集群的配置,经过几番努力,最终算是成功了。在配置

时,一开始理解不够,tomcat1上的jvmRoute我就配置成了jvm1,tomcat2上的jvmRoute配成了jvm2。后来通过查找资料明白了此处的jvmRoute是用来指定session的黏贴对象。为此我专门验证了下。设置了三个tomcat,

情形一:tomcat1的jvmRoute设置为jvm2,tomcat2的jvmRoute设置为jvm3,tomcat3的jvmRoute设置为jvm1。然后进行测试,结果发现三个tomcat轮流相应请求。

情形二:tomcat1的jvmRoute设置为jvm2,tomcat2的jvmRoute设置为jvm3,tomcat3的jvmRoute设置为jvm3。然后进行测试,结果发现当请求发到tomcat3时,以后的请求都是由tomcat3进行处理。不在转发给其他的tomcat。

阅读(1711) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~