apache tomcat集群
阿新 • • 發佈:2017-08-19
關於 等我 軟件 log 其余 set htm classname 帶圖片
今天花了大概兩個小時完畢了tomcat與apache的集群。現記錄一下,也希望能幫助後來者。
建議看這篇博客前,先閱讀一下鄙人拙作 tomcat整合apache
看完那個後,再進行集群,就非常快了。
在最後一行添上
之後 在conf文件夾下再建立一個mod_jk.conf,寫上
OK搞定
普通情況下,我們修改的都是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,其余兩個類似
給web-app根文件夾下加上以下一行,讓這個項目支持集群。
<distributable/>
http://localhost:81/PathTest/mytest.jsp
刷新幾下,添上名稱與值 能看到以下的頁面:
OK,session在三個tomcat中統一了,集群搞定
這說明,tomcat的請求分發機制是:對於某個session,先檢查有哪些tomcat能夠處理,第一次有三個,那麽就用這三個處理;假設某次檢查的時候,發現某個tomcat不能用了,那就讓session記住它,請求以後就不給那個tomcat了,即使後面這個tomcat又能用了,依然不給他 說白了,你拒絕我一次,我tm以後都不找你了!可是另起一個session後,兩個瀏覽器就都OK了#能夠理解為:"聽我姐妹說,你能夠,那麽就再給你一次機會嘍"~~~~
http://localhost:81/PathTest/jsp/a.jsp
我們訪問,這個地方,找不到圖片
怎麽辦?
關於VirtualHost還有總體的apache的配置,我不是非常清楚,總之上面這樣的配置能解決找不到jpg的問題。
建議看這篇博客前,先閱讀一下鄙人拙作 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"
LoadModule jk_module modules/mod_jk.so JkWorkersFile conf/workers.properties #指定那些請求交給tomcat處理,"controller"為在workers.propertise裏指定的負載分配控制器名 JkMount /*.jsp controller假設看完了我之前的那個博客,mod_jk的內容就非常easy理解了。
大家看到conf/workers.properties這行代碼了,非常easy,相對路徑conf下建立workers.properties
#server worker.list = controller #========tomcat1======== worker.tomcat1.port=18009 worker.tomcat1.host=localhost worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor = 1 #========tomcat2======== worker.tomcat2.port=28009 worker.tomcat2.host=localhost worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor = 1 #========tomcat3======== worker.tomcat3.port=38009 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
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">
今天的情況是,我們須要在一臺機器上,執行三個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
http://localhost:81/PathTest/jsp/a.jsp
我們訪問,這個地方,找不到圖片
怎麽辦?
把mod_jk改成以下的樣子。
LoadModule jk_module modules/mod_jk.so JkWorkersFile 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
參考資料
http://www.iteye.com/topic/1017961apache tomcat集群