httpd.conf
httpd.conf中添加:
#与tomcat的插件
include "D:\clusterServer\apache\conf\mod_jk.conf
mod_jk.conf
在apache的conf文件夹中创建mod_jk.conf文件,并添加以下内容:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名
JkMount /*.jsp controller
复制插件文件mod_jk.so到apache的modules文件夹中
workers.properties
新建并编辑workers.properties文件,内容如下:
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
# true:不进行回话复制,使用相同的tomcat处理回话; false:回话进行复制,一台tomcat当掉,另一台也可持续访问
worker.controller.sticky_session=false
#ture:当一台tomcat访问没有反馈的时候,转换到另一台tomcat处理
worker.controller.sticky_session_force=1
server.xml
tomcat配置文件:server.xml
修改server.xml文件相关的端口信息,若在同一台机器上部署多个tomcat,请确保多个tomcat能够同时启动。
Engine节点添加jvmRoute属性,属性的值要与apache中的配置文件workers.properties中的worker.controller.balanced_workers值中的一个。
Connector节点的port属性要与apache中的配置文件workers.properties中worker.tomcat1.port值一致。
去掉Engine节点以下配置信息的注释:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
说明:
其实这只是对Cluster的最简单的一种配置,该配置下tomcat使用的是all-to-all方式的session同步,这种方式只适用于小规模的集群,即,session复制。
tomcat另外一种session共享方式,只需为Cluster配置BackupManager即可,参看http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
web.xml
web工程的web.xml中添加以下配置信息:(属性告诉servlet/JSP容器,编写的应用将在分布式Web容器中部署)
<distributable/>
测试用jsp文件:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ 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="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>
==================================================================================================
常见问题:
1、 如果同一台机器上的节点之间session能够同步,但是不同机器间的session无法同步,可能的原因是机器间的时钟不同步,需要进行同步操作。
2、 关于jvmRoute。
前面实验中的sessionid由两部分组成(前缀+后缀),而其后缀名就是jvmRoute配置的名称,mod_jk需要根据这个后缀名进行请求转发:当sticky_session=1时,mod_jk根据这个后缀名来判断该会话应该始终由哪个tomcat进行处理。
参考书目:
Professional.Apache.Tomcat6
参考文档:
http://hi.baidu.com/wudengke213/item/5f63b016921850cc38cb306e
http://www.360doc.com/content/12/0404/19/9350055_200808330.shtml