如果在一台机器上进行多个Tomcat的负载均衡,最好下载解压版.
本人测试环境是在一个台物理机一台虚拟机上进行.
环境:
物理机(192.168.1.136):apache+tomcat
虚拟机(192.168.1.126):tomcat
apache2.2配置:
1.要先下载tomcat和apache的一个连接器mod_jk-1.2.28-httpd-2.2.3.so(其它版本似乎有问题,用不上,所以我用的这个版本,直接去apache的官网上就可以下载),将该文件放入%apache安装路径%/modules目录下.
2.在conf目录下编辑httpd.conf文件,直接在该文件末尾加上 include
"conf/mod_jk.conf"
表示将要引用另一个配置文件(不一定叫mod_jk.conf),也可以将3步中配置文件的信息直接写到httpd.conf中
3.在conf文件夹创建mod_jk.conf文件,写入以下信息:
#加载mod_jk Module
LoadModule jk_module
modules/mod_jk-1.2.28-httpd-2.2.3.so
#指定 workers.properties文件路径
JkWorkersFile conf/workers.properties
#指定日志文件
JkLogFile logs/mod_jk.log
#指定日志级别
JkLogLevel info
#日志记录的格式
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
JkMount /* loadbalancer #注意这里的loadbalancer
这是个自定义名称,见5步
#JkMount /*.do loadbalancer
4.在log目录下创建空文件mod_jk.log.
5.在conf目录下创建workers.properties,写入如下信息:
worker.list = tomcatV2,tomcatV4,loadbalancer
#server 列表
#========tomcatV2========
#ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcatV2.port=8009
#tomcat的主机地址,如不为本机,请填写ip地址,这里也可以写192.168.1.136
worker.tomcatV2.host=localhost
worker.tomcatV2.type=ajp13
#server的加权比重,值越高,分得的请求越多
worker.tomcatV2.lbfactor = 100
worker.tomcatV2.redirect=tomcatV4
#========tomcatV4========
#ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcatV4.port=8009
#tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcatV4.host=192.168.1.126
worker.tomcatV4.type=ajp13
#server的加权比重,值越高,分得的请求越多
worker.tomcatV4.lbfactor = 1
#本tomcat因故障不能接受请求,则转移到tomcatV2
worker.tomcatV4.redirect=tomcatV2
#========loadbalancer,负载均衡控制器========
worker.loadbalancer.type=lb
#指定分担请求的tomcat
worker.loadbalancer.balanced_workers=tomcatV2,tomcatV4
worker.loadbalancer.sticky_session=1
说明:tomcatV2,tomcatV4分别对应192.168.136和192.168.126上的tomcat,这一定要与两个tomcat中配置的名称一致,见下文.
tomcat6.0配置(以192.168.1.136的tomcat为例):
1.打开%tomcat安装目录%/conf目录,编辑server.xml,找到
(至此,负载均衡配置完成.以下是tomcat集群.可以每个tomcat中放入项目(项目文件见附录),进行测试:开启所有tomcat(这里都用8080端口),开启apache(默认是80端口),输入地址192.168.1.136/testCluster,注意这里没有输入8080,表示通过apache(我的apache和tomcatV2同放在192.168.1.136上)访问的测试项目,现在观察两个tomcat的控制台信息,由于访问量小,所以基本只有一个tomcat才在处理.
现在停止掉有反应的那个tomcat,依然访问上述地址,会看到另一个tomcat有了反应,说明在一台tomcat出了故障的时候,其它tomcat会接手其工作,进行处理.)
2.找到
channelSendOptions="8">
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
filter=""/>
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
由于apache和tomcat版本在更新,以上信息也有变动,贴别是一些类所在的包有变动,网上以前有人贴出的这个节点的配置就由于包的更改,导致tomcat无法启动,所以最好在要配置的tomcat版本的帮助文件中找到左侧Cluster配置帮助,直接粘贴其中的配置例子就可以了,如需更详细配置,则查看Cluster下的各个节点说明.
(如果是在同一机器上安装多个tomcat进行配置则还要修改
的这个值都不一样.在同一机器上配置的例子网上比较多,可搜索查阅)
3.修改testCluster项目的web.xml为附录中所示.
(至此,集群配置完成.在停掉一个tomcat的情况下,session中的信息依然存在于另一个tomcat,而没有丢失,且能看到这时候返回的信息来自于哪个tomcat)
附录:
在每个tomcat的webapps下都要建立这个测试项目testCluster,在其下建立index.jsp:
<%@ page contentType="text/html; charset=utf-8"
%>
<%@ page import="java.util.*" %>
Test
Server Info:
<%
out.println(request.getLocalAddr() + " : " +
request.getLocalPort()+"
");%>
<%
out.println("
ID " +
session.getId()+"
");
// Session
String dataName =
request.getParameter("dataName");
if (dataName != null && dataName.length()
> 0) {
String dataValue =
request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("Session");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value =
session.getAttribute(name).toString();
out.println( name + " = " +
value+"
");
System.out.println( name + " = " + value);
}
%>
建立WEB-INF目录及其下的web.xml,写入:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
补充:在集群环境中的所有PO一定要 implements Serializable