1. 程式人生 > >apache tomcat集群

apache tomcat集群

關於 等我 軟件 log 其余 set htm classname 帶圖片

今天花了大概兩個小時完畢了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.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
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.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

///////////以上是2016-8-16日改動

參考資料

http://www.iteye.com/topic/1017961

apache tomcat集群