Apache+Tomcat+JK叢集配置
轉:http://www.iteye.com/topic/1017961
參考:http://blog.csdn.net/parine26/article/details/4162326
第一步下載安裝apache:http://jingyan.baidu.com/article/d8072ac47baf0eec95cefdca.html
我下的win32 vc http://www.apachehaus.com/cgi-bin/download.plx?dli=S5mTuJVVBFjTUV1aPhkRxpkVOpkVFVVcltmRVdVQ
本文Apache+Tomcat叢集配置 基於最新的Apache和Tomcat,具體是2011年4月20日最新的Tomcat和Apache叢集和負載均衡配置。
準備環境
Apache
目前已經出現Apache2.3.11,但是為beta版本,所以沒有使用。
下載後直接安裝msi即可,如果沒有其他的http伺服器(如iis)則應該可以成功安裝,埠即為80,能夠訪問http://localhost/說明安裝成功。
Tomcat
Tocmat7目前已經出現穩定版本的7.0.12,Tomcat6則為6.0.32。經我測試,這2個版本的Apache負載均衡配置過程都是一樣的,因此下面的配置在Tomcat6或7叢集是通用的。但是按照下面的配置,叢集中Tomcat不能既有Tomcat6又有Tomcat7,否則雖能夠負載均衡,但不能進行session複製,不知其他方式配置的叢集是否可以。
Tomcat就不用怎麼介紹了。既然在本地需要多個節點,那麼需要下載ZIP版本的Tomcat。
JK
Apache官方下載地址 http://tomcat.apache.org/download-connectors.cgi
http://mirror.bit.edu.cn/apache/tomcat/tomcat-connectors/jk/binaries/windows/
這裡選擇的是mod_jk-1.2.31-httpd-2.2.3.so,如果http伺服器是Apache2.0.X版本,則必須選擇mod_jk-1.2.31-httpd-2.0.52.so,頁面下方有英文的說明,大家可以看下。
其實我也在網上看到Apache2.2已經整合Tomcat外掛模組了,可以不用JK外掛就可以實現Tomcat負載均衡,但也需要一些配置,而JK這個配置相比也不復雜,就先記錄下來。
配置過程
下面就直接寫過程了,我也是網路上學習的,只是總結下過程並且利用最新的Apache和Tomcat測試了下,還是與網路上有些不同的。
修改Apache配置
1、修改httpd.conf
我的Apache安裝在D:\Program Files\Apache Software Foundation\Apache2.2,找到conf目錄下的httpd.conf,在檔案的最後一行新增
include "D:\Program Files\Apache Software Foundation\Apache2.2\conf\mod_jk.conf"
2、新建mod_jk.conf檔案,內容如下:
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so
JkWorkersFile conf/workers.properties
#指定那些請求交給tomcat處理,"controller"為在workers.propertise裡指定的負載分配控制器名
JkMount /*.jsp controller
3、將下載的JK外掛mod_jk-1.2.31-httpd-2.2.3.so複製到Apache安裝目錄的modules目錄下。
4、新建並編輯workers.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=192.168.0.80 //在我的虛擬機器中的,可以算遠端的吧
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,此處配置了3個Tomat伺服器,2個本地,1個遠端,所以為了它們都能夠順利啟動起來,本地的伺服器埠都是不同的,如果Tomcat不再同一機器上,沒必要改埠的。
配置Tomcat
配置3個Tomcat伺服器,將Tomcat解壓後複製3份,我將每個資料夾分別命名為Tomcat1,Tomcat2和Tomcat3,修改每一份的server.xml配置,將Tomcat1中修改部分如下圖:
Tomcat2中以上部分的server.xml為:
Tomcat3中以上部分的server.xml為:
因為Tomat3在遠端伺服器,所以沒必要改埠的,而我先進行的本地叢集測試後將Tomcat3複製到遠端伺服器,所以這3個Tomcat埠都不同。
AJP13的connector的poat和jvmRoute名稱和workers.properties中配置對應。
由於截圖面積有限,還需要保證本地2個本地Tomcat配置server的port,connector為http1.1的port都不相同。
測試
建立測試專案
建立test專案,需要在專案的web.xml中新增<distributable/>
建立test2.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="test2.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測試
將專案部署到3個伺服器,然後分別啟動Apache和3個Tocmat伺服器,這些Tomcat啟動順序隨意,然後開啟http://localhost/test/test2.jsp,結果如下圖:
F5重新整理頁面,分別出現:
多次重新整理頁面的sessionID看是同一個ID,說明session是複製成功了。那麼session中的儲存的東西呢,在輸入框中分別輸入1、1,2、2,3、3後,顯示結果如下圖:
以上的測試說明,叢集中的session已經共享,每個叢集對於同一訪問均有相同的session,而且session中儲存的變數也複製了。
節點插拔測試
插拔意思是應該保證當執行的叢集中某節點中關閉或者啟動時,叢集正常工作並且節點能夠正常工作。
下面描述測試過程了,貼圖太佔地方了。
關閉Tomcat2,重新整理頁面,則不斷訪問Tocmat1和Tomcat3,再關閉Tomcat1後,則只訪問一個Tomcat3,說明節點關閉時執行正常。
如果重啟Tomcat2,無論怎麼重新整理,始終訪問Tomcat3,難道Apache不能將請求轉發給中途啟動的Tomcat2?。。。這時利用另外臺機器訪問頁面,發現Tomcat2正常,然後在刷本地頁面,又可以訪問Tomcat2了。
從上面可以看出Apache的負載均衡時的演算法了,對於每個新來的session,Apache按照節點配置中的lbfactor比重選擇訪問節點,如果某節點node1不能訪問,則尋找下一可訪問節點,並且將此node1就在該訪問session的訪問黑名單中,以後該session的訪問直接不考慮node1,即使node1又可以訪問了。而新來的session是無黑名單的,如果新的session能夠訪問到node1了,則會將node1在其他所有session訪問的黑名單刪除,這樣其他session就又能訪問node1節點了。以上只是個人經過測試後的猜想。
經過以上測試,說明Tomcat叢集和負載均衡已經實現了。
關於叢集我還有些疑問,所以又測試了下,直接把結論寫出來:
1.叢集下的相同的應用可以名稱不同(好像沒必要啊),只要配置server.xml中host下的context具有相同的path即可。
2. 如果應用名稱可以不同,那麼應用下內容是否可以不同呢(這裡考慮將不同應用通過叢集看起來是一個應用,並且共享session),然後叢集下不同應用對映為相同的訪問path,具有相同的路徑則負載,如果某路徑只某個應用具有,則一直訪問該應用。可現實很骨幹啊,答案是否定的,至少我以上的配置不能實現。如果訪問只有某應用具有的特別路徑,那麼只有負載到該應用才可以訪問,否則直接路徑未找到的錯誤頁面了。
如果您看過網上其他Apache+Tomcat的叢集配置,您可能有的疑問?
1.網上大部分的文章配置2個tocmat的叢集,有的將workers.properties下的worker.controller.sticky_session=1,
然後tomcat1中的server.xml中的jvmRoute設定為tomcat2,將tomcat2中的jvmRoute設定為tocmat1,當然我這樣設定
也成功了,但是如果3個或者更多tocmat呢,怎麼設定每個tomcat的jvmRoute,我不會所以才考慮現在的配置
2.server.xml中的Cluster配置問題,網上大部分都是使用BackupManager方式,即Cluster下又貼上了一堆配置。其實
只要將其中註釋掉的<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>去掉註釋就完成session的叢集
複製了。只是這倆種複製採用的方式不同而已。http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html,
這頁面已經說的挺清楚了,叢集的session複製預設是DeltaManager,是all to all的複製,意思是將叢集下1個tomcat應用下的session
對所有的叢集中的節點進行復制,即使那個節點沒有釋出應用。顯然是不好的方式,但這在小規模的叢集下並沒神馬問題。
而採用BackupManager,就是眾多網上配置那樣,對於需要複製的節點設定BackupManager自然也沒問題,
但是它的效能並沒有DeltaManager 好使“ Downside of the BackupManager: not quite as battle tested as the delta manager”。
因此,具體怎麼設定就看大家了,通常說如果不是大規模叢集,就預設就好了。反正我自己翻譯的就是這個意思了,希望沒有誤導大家。
測試 在配置 過程中 使用的是Apache2.4 在配置代理過程中,出現問題 參考:http://www.linuxidc.com/Linux/2013-11/92322.htm
http://jingyan.baidu.com/article/1876c8529047e6890b1376e3.html
最終解除安裝 apache2.4 改為安裝 apache2.2
採用apache2.2 http://blog.chinaunix.net/uid-346158-id-2130764.html
linux下配置: http://www.linuxidc.com/Linux/2013-11/92322.htm
apache2.2.29下載地址:http://www.apachehaus.com/cgi-bin/download.plx?dli=OhkWxQ2UNFjTUx2KZVlTwAlVOpkVFVFdZVlVal1d
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context crossContext="true" docBase="/home/upload" path="/upload" reloadable="true"/>
<Context crossContext="true" docBase="/home/upload/tmp" path="/tmp" reloadable="true"/>
<Context path ="" debug="0" docBase ="/home/tomcat/webapps/fahuobao" reloadable="true" privileged="true"/>
3種叢集方式:http://www.blogjava.net/pengo/archive/2011/04/15/348331.html