參考:
http://blog.csdn.net/bluishglc/article/details/6867358#
http://andashu.blog.51cto.com/8673810/1381369
所搭配環境為centos6.4
本文是采用的mod_jk的方式搭建的集群環境。
一、安裝apache
首先安裝apache,編譯完成后,通過IP:端口訪問就行,如果返回“it workers”證明Apache啟動成功(注意apache的工程路徑要正確)
1.進入下載好的httpd-2.2.25.tar.gz文件所在目錄,執行解壓操作: tar -zxvf httpd-2.2.25.tar.gz 2.進入解壓出的文件夾根目錄: cd httpd-2.2.25 3.進行編譯參數配置: ./configure --prefix=/usr/local/apache2 --enable-mods-shared=all 關於configure參數的更多內容可參考: http://httpd.apache.org/docs/2.2/en/programs/configure.html#installationdirectories 4.編譯安裝: make make install 5.啟動和關閉apache 完成上述步驟后,apache的安裝就結束了,通過下面的命令啟動和關閉apache: 啟動: /usr/local/apache2/bin/apachectl start 關閉: /usr/local/apache2/bin/apachectl stop apache安裝有問題,可以參考 : http://user.qzone.qq.com/1987870278/infocenter#!app=2&via=QZ.HashRefresh&pos=1375688798
關於在安裝apache過程中報Cannot use an external APR with the bundled APR-util錯誤的解決辦法 有時候,在安裝apache,執行./configure操作時會報這個錯誤,解決方法是安裝apache2.2.x自身攜帶的apr,方法為: 1.自源碼安裝目錄httpd-2.2.25進入apache2.2.x自帶apr的安裝目錄 cd srclib/apr 2.安裝apr(此處將之安裝在/usr/local/apr下,如果系統中已經安裝apr,可找到安裝目錄進行覆蓋) ./configure --prefix=/usr/local/apr make make install 3.安裝apr-util ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr make make install 4.使用新安裝的apr重新進行apache編譯配置 放回安裝根目錄httpd-2.2.25,執行: ./configure --prefix=/usr/local/apache2 \ --enable-mods-shared=all \ --with-apr=/usr/local/apr \ --with-apr-util=/usr/local/apr-util/bin 補充:[因為安裝的是低版本,這個沒有試] 如果你安裝是apache-2.4以上版本,有以下幾點不同: 1、需要單獨下載apr和apr-util apr下載地址: http://mirror.bjtu.edu.cn/apache//apr/apr-1.4.6.tar.bz2 apr-util下載地址:http://mirror.bjtu.edu.cn/apache//apr/apr-util-1.4.1.tar.bz2 2. 此外還需要安裝pcre 去http://pcre.org/下載pcre,解壓進入源碼目錄執行 ./configure --prefix=/usr/local/pcre 3. 最后安裝apache時configure需要這樣配置 ./configure --prefix=/usr/local/apache2 \ --enable-mods-shared=all \ --with-apr=/usr/local/apr \ --with-apr-util=/usr/local/apr-util/bin --with-pcre=/usr/local/pcre
二、安裝mod_jk
1.進入下載好的tomcat-connectors-1.2.32-src.tar.gz文件所在目錄,執行解壓操作:
tar -zxvf tomcat-connectors-1.2.32-src.tar.gz
2.進入解壓出的文件夾下的native子目錄:
cd tomcat-connectors-1.2.32-src/native
3.進行編譯參數配置:
./buildconf.sh
./configure --with-apxs=/usr/local/apache2/bin/apxs --with-java-home=$JAVA_HOME --with-java-platform=2 --enable-jni
執行這步時,可能會提示未安裝各種包如autoconf,按提示安裝完后再執行就可以。
4.編譯安裝:
make
make install
如果成功結束,你可以在/usr/local/apache2/modules/下找到mod_jk.so文件。
或直接下載JK,下載地址為http://mirror.bjtu.edu.cn/apache/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.31/,如果http服務器是Apache2.0.X版本,則必須選擇mod_jk-1.2.31-httpd-2.0.52.so或以上版本,這里宣傳的mod_jk-1.2.23-apache-2.2.x-linux-x86_64.so,跟自己操作系統版本吻合,然后重命名為mod_jk.so,並且賦值777權限。
三、安裝tomcat
1、下載tomcat,可以通過下面的命令下載:
#wget http://apache.mirror.phpchina.com/tomcat/tomcat-6/v6.0.18/bin/apache-tomcat-6.0.18.tar.gz
2、解壓啟動測試:
#tar -zxvf apache-tomcat-6.0.18.tar.gz
#./apache-tomcat-6.0.18/bin/startup.sh
在瀏覽器中輸入:http://localhost:8080,看是否啟動正常,若正常進行第三步。
3、下面通過一個簡單的" Test.jsp "程序進一步驗證 Tomcat 是否安裝成功。在webapp目錄下新建一個項目名稱如test,在此目錄下新建一個源文件。
新建名稱為" Test.jsp "的 Jsp 源文件並在其中輸入如下代碼。
<%@ page contentType="text/html;charset=GBK"%> <html> <head> <title> Tomcat_ _測試 </title> </head> <body> <font color = "red" size = "20" > <% out.print( "_ _恭喜您,成功的安裝並啟動了 Tomcat " ); %> </font> </body> </html>
4、重啟(命令如下),然后輸入:http://localhost:8080/test/Test.jsp 看是否正常。
#./apache-tomcat-6.0.18/bin/shutdown.sh
#./apache-tomcat-6.0.18/bin/startup.sh
安裝tomcat成功后。
需要進一步修改/conf/server.xml文件。
四、安裝tomcat集群配置。
集群里有多個tomcat時,可先搭建一個tomcat,與apache關聯配置沒有問題了再安裝多個tomcat。當然也可以直接安裝多個tomcat直接進行配置。
1、安裝兩個或以上tomcat
#./apache-tomcat-6.0.18/bin/shutdown.sh
#mv apache-tomcat-6.0.18 /usr/local/TC6_A
#cd /usr/local
#cp -a TC6_A TC6_B
提示:進行上述步驟操作的原因是,本案例中集群的各個 Tomcat 服務器實例運行在同一個物理服務器上,因此集群中有幾個 Tomcat 實例一般就需要幾個 Tomcat 的安裝。另外,由於集群中的各個 Tomcat 實例位於同一個物理服務器上的一個操作系統下,因此各個實例占用的各種網絡端口不能相同,否則集群中的多個 Tomcat 實例不能同時正常啟動,下面的步驟將介紹如何修改 Tomcat 實例需要使用的各個網絡端口。
2、修改 Tomcat 實例需要使用的各個網絡端口
對於tomcat配置主要集中在conf/server.xml文件上。首先,鑒於是在同一機器上運行多個tomcat實例,因此,要對 server.xml中配置的所有端口進行修改,避免端口被占用,一種簡單而穩妥的修改方法是將該文件中出現的所有端口號按一種簡單的規則統一進行改動, 比如在原端口號基礎上統一加1000或減1000。基於這個原則,tomcat1的連接端口修改 為:6080,tomcat-2的連接端口修改為:7080,其他端口配置同樣依照該原則。
1)找到 server.xml 配置文件中的" Server "配置項目,並進行修改。
<Server port="8005" shutdown="SHUTDOWN"> <Server port="6005" shutdown="SHUTDOWN">
說明:第一行為兩個 Tomcat 修改前的情況,第二行為 TC6_A Tomcat 修改后的情況。如果多個tomcat里server的port端口值相同,則只能啟動一個tomcat成功。
2)找到 server.xml 配置文件中的相應" Connector "配置項目,並進行修改。
- 修改前內容如下:
<!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" />
- TC6_A 中修改后內容如下:
<!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port = "6009 " protocol = "AJP/1.3" redirectPort = " 10043 " />
提示:此步驟目的是修改 AJP Connector 端口。
注意:
port 的取值必須要於mod_jk中的workers.properties文件中設置的每個結點名稱的port要相對應。
3)找到 server.xml 配置文件中的另一個相應" Connector "配置項目,並進行修改。
- 修改前內容如下:
<Connector port = "8080" protocol = "HTTP/1.1" connectionTimeout = "20000" redirectPort = "8443" />
- TC6_A 中修改后內容如下:
<Connector port = "6080" protocol = "HTTP/1.1" connectionTimeout = "20000" redirectPort = "10043" />
提示:此步驟目的是修改 HTTP Connector 端口,其中的port 是未來通過瀏覽器訪問集群中各個 Tomcat 實例的 HTTP 端口。
4)通過修改 Engine 配置選項,配置集群中每個 Tomcat 實例的名稱。
- 修改前內容如下:
<!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine name = "Standalone" defaultHost = "localhost" jvmRoute = "jvm1"> <Engine name = "Catalina" defaultHost = "localhost"> -->
- TC6_A 中修改后內容如下:
<Engine name = "Standalone" defaultHost = "localhost" jvmRoute = "Tomcat1">
提示:注意在修改過程中要注釋掉原來 name 為 Catalina 的 Engine 配置項目,將 name 為 Standalone 的 Engine 配置項目的注釋去掉並修改 jvmRoute 屬性。
注意:
jvmRoute 的取值必須要於mod_jk中的workers.properties文件中設置的結點名稱相一致。
因為:該值將做為后綴加在每一個由該結點生成的jsessionid后面,而mod_jk正是根據sessionid后面的這個后綴來確定一個請求應由哪一個結點來處理。(這是實現session_sticky的基本保證)
5)修改配置文件中的 Cluster 配置項目,對集群的各項參數進行設置。——此項是為了做session共享。
- 修改前內容如下:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" />
- TC6_A 中修改后內容如下:
<Cluster className = "org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions = "8"> <Manager className = "org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown = "false" notifyListenersOnReplication = "true" /> <Channel className = "org.apache.catalina.tribes.group.GroupChannel" > <Membership className = "org.apache.catalina.tribes.membership.McastService" address = "228.0.0.4" port = "45564" frequency = "500" dropTime = "3000"/> <Receiver className = "org.apache.catalina.tribes.transport.nio.NioReceiver" address = "auto" port = "4000" autoBind = "100" selectorTimeout = "5000" maxThreads = "6" /> <Sender className = "org.apache.catalina.tribes.transport.ReplicationTransmitter" > <Transport className = "org.apache.catalina.tribes.transport.nio.PooledParallelSender" /> </Sender> <Interceptor className = "org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" /> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" /> </Channel> <Valve className = "org.apache.catalina.ha.tcp.ReplicationValve" filter="" /> <Valve className = "org.apache.catalina.ha.session.JvmRouteBinderValve" /> <Deployer className = "org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir = "/tmp/war-temp/" deployDir = "/tmp/war-deploy/" watchDir = "/tmp/war-listen/" watchEnabled = "false"/> <ClusterListener className = "org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" /> <ClusterListener className = "org.apache.catalina.ha.session.ClusterSessionListener" /> </Cluster>
這份默認配置可以滿足大多數應用場景,因此,我們只需要將這份配置復制到<Engine/>中,tomcat的配置就全部完成了。
注意:集群里,每個tomcat里port值要不相同。如tomcat1為4000,tomcat2要為4001
提示:上述配置內容主要是對集群中各個 Tomcat 實例間進行通信的方式、端口以及 Session 共享算法的設置。
3、多個tomcat里,直接將已設置好的server.xml文件拷貝到新的tomcat中將默認的配置文件替換,再按照上述步驟2,修改各個值。
共需要修改5個位置。
五、設置apache集群。
1、打開apache安裝目錄下的conf/httpd.conf文件,在文件最后追加以下內容:
# Load mod_jk module LoadModule jk_module modules/mod_jk.so # Specify jk log file. JkLogFile /var/log/mod_jk.log # Specify jk log level [debug/error/info] JkLogLevel info # Specify workers.properties, this file tell jk: # how many nodes and where they are. JkWorkersFile conf/workers.properties # Specify which requests should handled by which node. JkMount /* controller
關於mod_jk配置項的詳細內容,可參考:http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html
2、根據步驟1的設置,JkWorkersFile conf/workers.properties 指明由一個workers.properties文件來描述集群結點的情況。
因此,我們需要創建這個workers.properties文件,並放置於conf文件夾下,這個文件的內容如下:
#所有節點列表,其中controller是一個邏輯結點,負責負載均衡控制, #如果JkMount中的URL指定給了controller就表示這個請求會被自動散列到某個物理節點上。 #注意:真正負責處理請求的tomcat的名稱(這里就是tomcat1,tomcat2)必須於它們在conf/server.xml #文件中配置的jvmRout的屬性值是一致的! worker.list = controller,tomcat1,tomcat2 #========tomcat1======== worker.tomcat1.port=6009 #ajp13 端口號,在tomcat下server.xml配置,默認8009 worker.tomcat1.host=localhost #tomcat的主機地址,如不為本機,請填寫ip地址 worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor = 1 #server的加權比重,值越高,分得的請求越多 #========tomcat2======== worker.tomcat2.port=7009 #ajp13 端口號,在tomcat下server.xml配置,默認8009 worker.tomcat2.host=localhost #tomcat的主機地址,如不為本機,請填寫ip地址 worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor = 1 #server的加權比重,值越高,分得的請求越多 #========controller,負載均衡控制器======== worker.controller.type=lb worker.controller.balance_workers=tomcat1,tomcat2 #指定分擔請求的tomcat,舊版本中的balanced_workers,已不再推薦使用! worker.controller.sticky_session=1 #sticky_session為1表示,當某一 client的session創建之后,后續由該客戶端發起的請求,也就是這個session的所有請求都始終由第一次處理該請求的結點 #負責處理(除非該結點掛掉)
這里的配置文件為2個tomcat里的配置文件,如果是多個則可以類似修改。
若上述配置文件,啟動時只有一個tomcat,則搭建的是相當於是apache與一個tomcat的集群。
3、應用程序要為集群所做的准備
1. 在應用程序的web.xml中需要加入:<distributable/>元素
2. session中存放的數據(如attribute)必須實現序列化。
六、集群方式驗證。
到第五步結束后,所有配置均已完成,啟動兩個tomcat和apache后,將某一應用同時部署到兩個tomcat中,通過apache訪問這個應用,觀察tomcat后台打出的日志會發現,請求被隨機分配給了兩個tomcat交替執行。
1、頁面方式驗證
重啟apache+加一個tomcat。
測試:
1)http://ip:6080/test/test.jsp,查看是否顯示正常,若正常說明tomcat1啟動是正常的。
2)http://ip/test/test.jsp ,查看是否顯示正常,若正常說明apache+tomcat1集群沒有問題。
重啟apache+加二台tomcat。
測試:
1)http://ip:6080/test/test.jsp,查看是否顯示正常,若正常說明tomcat1啟動是正常的。
2)http://ip:7080/test/test.jsp,查看是否顯示正常,若正常說明tomcat2啟動是正常的。
3)http://ip/test/test.jsp ,查看是否顯示正常,若正常說明apache+2台tomcat集群設置成功。
為驗證集群策略,可以將test.jsp頁面將當前的tomcat實例名稱打印出來。
客戶端打開此頁面時,查看頁面是否會顯示不同的tomcat實例名稱。
2、可以直接查看apache與tomcat的日志,可看出集群是否生效。
關於apache+tomcat的session共享
http://andashu.blog.51cto.com/8673810/1381370
實現了負載均衡,現在我們實現session共享 一、tomcat集群配置,session 同步配置: tomcat1配置 A、修改Engine節點信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> B、去掉<Cluster> <\Cluster> 的注釋符 C、修改Cluster 節點信息 <Membership className="org.apache.catalina.cluster.mcast.McastService" mcastBindAddress="127.0.0.1" #IP自己配置,遠程的話寫遠程IP mcastAddr="224.0.0.1" mcastPort="45564" mcastFrequency="500" mcastDropTime="3000"/> <Receiver className="org.apache.catalina.cluster.tcp.ReplicationListener" tcpListenAddress="127.0.0.1" tcpListenPort="4001" tcpSelectorTimeout="100" tcpThreadCount="6"/> tomcat2配置: A、修改Engine節點信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2"> B、去掉<Cluster> <\Cluster> 的注釋符 C、修改Cluster 節點信息 <Membership className="org.apache.catalina.cluster.mcast.McastService" mcastBindAddress="127.0.0.1" #IP自己配置 mcastAddr="224.0.0.1" mcastPort="45564" mcastFrequency="500" mcastDropTime="3000"/> <Receiver className="org.apache.catalina.cluster.tcp.ReplicationListener" tcpListenAddress="127.0.0.1" #IP自己配置 tcpListenPort="4002" # 一定要改 tcpSelectorTimeout="100" tcpThreadCount="6"/> 修改web應用里面WEB-INF目錄下的web.xml文件,加入標簽 <distributable/> 直接加在</web-app>之前就可以了 做tomcat集群必須需要這一步,否則用戶的session就無法正常使用。 注意事項: 1、mcastAddr="224.0.0.1"這主廣播地址因此需要開啟網卡組播功能 route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 分別在各機器上運行 2、查看端口情況:Netstat –antl |grep 4001 同步監聽的端口(2台tomcat在不同機器情況下) tocat1 200811181227002475084.jpg tomcat2 200811181227002481388.jpg 3、測試廣播: java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal1 java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal2 如果不報錯則能正常廣播tomcat-replication.jar 下載:[url]http://cvs.apache.org/~fhanik/tomcat-replication.jar[/url]如果是二台機器,可以用tcpdump 抓取包 二、測試集群及session同步 在2個tomct的webapps 下新建test 目錄目錄下建WEB-INF目錄下的web.xml文件 <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee [url]http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd[/url]" version="2.4"> <display-name>TomcatDemo</display-name> <distributable/> </web-app> 再在webapps 下建立print.jsptest.jsp Print.jsp : <% System.out.println("http://andashu.blog.51cto.com/); %> test.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>"); String dataName = request.getParameter("dataName"); session.setAttribute("myname","session?"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } out.print("<b>Session P±?b>"); 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="index.jsp" method="POST"> 3?<input type=text size=20 name="dataName"> <br> ?:<input type=text size=20 name="dataValue"> <br> <input type=submit> </form> </body> </html> 重啟所有的服務。 訪問[url]http://192.168.19.199/test/print.jsp[/url] 如圖可以看出tomcat 集群配置完成 spacer.gifwKioL1MsmXLDq3i0AAFlFkwY8IQ185.jpg Session 復制的查看: 在同一窗口,輸入名稱和值, 在2個tomcat日志里能看到同樣內容的日志,就表明成功了。