標籤:red down while nts lin false director classname pac
今天花了大概兩個小時完畢了tomcat與apache的叢集。現記錄一下,也希望能協助後來者。
建議看這篇部落格前,先閱讀一下鄙人拙作 tomcat整合apache
看完那個後,再進行叢集,就非常快了。
和之前 tomcat整合apache中的一樣,這次叢集用的軟體版本號碼例如以下:
jdk 7 ,tomcat 6.0.44,apache2.2.4,mod_jk的版本號碼是1.2.26。
配置apache
更改apache下的httpd.conf
先把listen 80改成listen 81或者別的,大家都知道,80這個port常常被佔用的。
在最後一行添上
include "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\conf\mod_jk.conf"
之後 在conf檔案夾下再建立一個mod_jk.conf,寫上
LoadModule jk_module modules/mod_jk.soJkWorkersFile conf/workers.properties#指定那些請求交給tomcat處理,"controller"為在workers.propertise裡指定的負載分配控制器名JkMount /*.jsp controller
假設看完了我之前的那個部落格,mod_jk的內容就非常easy理解了。
大家看到conf/workers.properties這行代碼了,非常easy,相對路徑conf下建立workers.properties
#serverworker.list = controller#========tomcat1========worker.tomcat1.port=18009worker.tomcat1.host=localhostworker.tomcat1.type=ajp13worker.tomcat1.lbfactor = 1#========tomcat2========worker.tomcat2.port=28009worker.tomcat2.host=localhostworker.tomcat2.type=ajp13worker.tomcat2.lbfactor = 1#========tomcat3========worker.tomcat3.port=38009worker.tomcat3.host=localhost worker.tomcat3.type=ajp13worker.tomcat3.lbfactor = 1 #========controller,負載平衡控制器========worker.controller.type=lbworker.controller.balanced_workers=tomcat1,tomcat2,tomcat3worker.controller.sticky_session=falseworker.controller.sticky_session_force=1#worker.controller.sticky_session=1
OK搞定
lbfactor是幹什麼的?
假設tomcat1,tomcat2,tomcat3的lbfactor各自是2,5,4那麼全部的請求中2/11會分配給tomcat1處理,5/11會給tomcat2....
配置tomcat改動port在這裡,我先說明一點,一個tomcat有三個port#各自是支援http1.1的connectorport,支援ajp1.3的connectorport與tomcat的Serverport#分別例如以下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> .......<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> .......<Server port="8005" shutdown="SHUTDOWN">
普通情況下,我們修改的都是8080,也就是支援http1.1協議的這連接埠。
今天的情況是,我們須要在一台機器上,執行三個tomcat,那麼這個三個tomcat共9個port就得所有不一樣。
另外,在workers.properties裡面的worker.tomcat3.port=38009這個port也指的是tomcat的ajpport。
我們有3個tomcat,最好就放到一起吧,例如以下
首先改動那9個port號,為了清晰,tomat1的三個port各自是18080,18009,18005,其餘兩個類似
改動engine改動每一個tomcat下server.xml中的engine,後面加上jvmRoute="tomcat1",當然tomcat2下的jvmRoute就是tomcat2了,注意這個tomcat1,tomcat2與workers.properties中的那個得相應。
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
加上Cluster這個,事實上不須要又一次寫,在engine的以下,cluster本來是被凝視掉的,去掉凝視就可以
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
改動web.xml將一個javaweb項目複製三份,分別放到各個tomcat/webapps下,然後改動每一個項目的web.xml
給web-app根資料夾下加上以下一行,讓這個項目支援叢集。
<distributable/>
測試在每一個project的根資料夾下加上一個jsp(這個jsp來自網路上)
mytest.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="mytest.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>然後我們訪問
http://localhost:81/PathTest/mytest.jsp
重新整理幾下,添上名稱與值 能看到以下的頁面:
OK,session在三個tomcat中統一了,叢集搞定
幾個問題1 本來有3個tomcat,我們關閉當中一個後,假如是tomcat2,那麼之後我們再重新整理mytest.jsp的時候,就會發現就僅僅有tomcat1與tomcat3在處理請求了。OK,這是符合我們推測的。等我們又一次啟動tomcat2後,再重新整理,發現請求還是沒有發到tomcat2中#假設我們又一次啟一個session(就是再開一個瀏覽器)發現請求在三個tomcat中又能迴圈處理了#
這說明,tomcat的請求分發機制是:對於某個session,先檢查有哪些tomcat能夠處理,第一次有三個,那麼就用這三個處理;假設某次檢查的時候,發現某個tomcat不能用了,那就讓session記住它,請求以後就不給那個tomcat了,即使後面這個tomcat又能用了,依然不給他 說白了,你拒絕我一次,我tm以後都不找你了!可是另起一個session後,兩個瀏覽器就都OK了#能夠理解為:"聽我姐妹說,你能夠,那麼就再給你一次機會嘍"~~~~
以上為charyle的理解。詳細評述見http://www.iteye.com/topic/1017961
2 大家不要忘記,我在PathTest這個項目裡,還有幾個帶圖片的jsp,大家看看
http://localhost:81/PathTest/jsp/a.jsp
我們訪問,這個地方,找不到圖片
怎麼辦?
把mod_jk改成以下的樣子。
LoadModule jk_module modules/mod_jk.soJkWorkersFile conf/workers.properties # 設定虛擬機器主機,定義port為81 <VirtualHost 127.0.0.1:81> ServerName 127.0.0.1 DocumentRoot "E:/cluster/tomcat1/webapps" #定義網站項目所在路徑,把路徑指向 tomcat 中的預設網站資料夾 DirectoryIndex index.html index.htm index.jsp ErrorLog logs/shsc-error_log.txt #指定那些請求交給tomcat處理,"controller"為在workers.propertise裡指定的負載分配控制器名JkMount /*.jsp controller </VirtualHost>
關於VirtualHost還有總體的apache的配置,我不是非常清楚,總之上面這樣的配置能解決找不到jpg的問題。
///////////下面是2016-8-16日改動
非常羞愧,發現大家用的都是tomcat8或tomcat7,我這還是6,可是也懶得再去升級了
大家看這個部落格吧:
http://blog.csdn.net/flyliuweisky547/article/details/21293071
上面的是tomcat8與apache的叢集
假設tomcat要把session放到redis裡,再看看以下這部落格
http://blog.csdn.net/caiwenfeng_for_23/article/details/45666831
///////////以上是2016-8-16日改動
參考資料http://www.iteye.com/topic/1017961
apache tomcat叢集