環境準備
Tomcat服務器集群中需要進行環境準備:
- Apache:Apache是http服務器,利用其對Tomcat進行負載均衡,這里使用的版本是Apache HTTP Server2.0.64;
- Tmocat:Tmocat7.0.6;
- JK:JK是Tmocat提供給http服務器的插件,這里使用的版本是tmocat-connectors-1.2.37-windows-i386-httpd-2.0.x;
- 系統:win7。
軟件安裝
Apache
下載完成之后,直接安裝apache,安裝完成之后,在瀏覽器中輸入http://localhost/,能夠看到下圖則說明安裝成功:

Tomcat
解壓下載好的tomcat縮包,復制三份解壓好的tomcat文件夾,分別重命名為tomcat1,tomcat2,tomcat3。
配置過程
Apache配置修改
修改httpd.conf,找到conf目錄下的httpd.cof,在文件的最后一行添加:
include "C:\Program Files (x86)\Apache Group\Apache2\conf\mod_jk.conf"
新建mod_jk.conf文件,在conf目錄下新建mod_jk.conf文件,內容如下:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkMount /*.jsp controller
解壓下載的jk文件,將里面的so文件復制到Apache安裝目錄的modules目錄下,這里下載的jk文件名為mod-jk.so。新建并編輯workers.properties文件。在conf文件夾下新建worker.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
#========tomcat3========
worker.tomcat3.port=13009
worker.tomcat3.host=localhost
worker.tomcat3.type=ajp13
worker.tomcat3.lbfactor = 1
#========controller,負載均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3
worker.controller.sticky_session=false
worker.controller.sticky_session_force=1
#worker.controller.sticky_session=1
如果需要配置遠程的tomcat服務器的話,只需要將worker.tomcat3.host=localhost中的localhost改為遠程服務器的IP地址即可。本次配置都是本地的tomcat,并且在一臺機器上,所以端口號都不相同,如果在不同服務器上,端口號則不需要更改。
Tomcat配置
修改之前復制好的三份tmocat中的server.xml配置,打開conf/server.xml文件,修改如下圖:
tomcat1:


Tomcat2:

Tomcat3:


結果測試
在tomcat下面的項目文件夾中修改web.xml,如這里使用test項目,則修改三個tomcat下面的test項目中的web.xml,在每個web.xml的<display-name>節點后添加新的節點<distributable/>。在每個test項目文件夾下新建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.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="test.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>
Session測試
項目部署好之后,啟動三個tomcat以及Apache,啟動順序隨意,然后再瀏覽器中輸入http://localhost/test/test.jsp,結果如下圖:
刷新頁面,如下圖:
再次刷新,如下圖:

多次刷新頁面的sessionID看是同一個ID,說明session是復制成功了。那么session中的存儲的東西呢,在輸入框中分別輸入1、1,2、2,3、3后,顯示結果如下圖:



節點插拔測試
關閉Tomcat
關閉tomcat3,刷新頁面,可以不斷訪問tomcat1和tomcat2,再關閉tomcat2,只能夠訪問tomcat1,說明節點關閉時運行正常。
啟動Tomcat
如果重啟Tomcat2,無論怎么刷新,始終訪問Tomcat3,無法訪問tomcat2,這時利用另外臺機器訪問頁面,發現Tomcat2正常,然后在刷本地頁面,又可以訪問Tomcat2了。對于每個新來的session,Apache按照節點配置中的lbfactor比重選擇訪問節點,如果某節點node1不能訪問,則尋找下一可訪問節點,并且將此node1就在該訪問session的訪問黑名單中,以后該session的訪問直接不考慮node1,即使node1又可以訪問了。而新來的session是無黑名單的,如果新的session能夠訪問到node1了,則會將node1在其他所有session訪問的黑名單刪除,這樣其他session就又能訪問node1節點了。經過以上測試,說明Tomcat集群和負載均衡已經實現了。