apache tomcat叢集

來源:互聯網
上載者:User

標籤: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叢集

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.