TOMCAT6配置負載均衡和集群 _2
最近要配置tomcat集群,在網上搜了很多文章,但照著步驟一步一步做到最后卻無法成功,著使我費了兩天的勁查看了apache 和 tomcat的大量文檔,才將問題一一解決。為方便自己和新手配置tomcat集群,我將整理好的過程曬一曬,希望可以幫到后來人少走一些彎路。
==================
目標:
使用 apache 和 tomcat 配置一個可以應用的 web 網站,要達到以下要求:
1、 Apache 做為 HttpServer ,后面連接多個 tomcat 應用實例,并進行負載均衡。
2、 為系統設定 Session 超時時間,包括 Apache 和 tomcat
3、 為系統屏蔽文件列表,包括 Apache 和 tomcat
注:本例程以一臺機器為例子,即同一臺機器上裝一個apache和2個Tomcat。
一、前期準備工作:安裝用的程序(前提保證已安裝了JDK1.5以上的版本)
APAHCE 2.2.8下載:apache_2.2.8-win32-x86-no_ssl.msi
TOMCAT6.0.14下載:apache-tomcat-6.0.14.zip直接解壓。
二、安裝過程
APAHCE安裝目錄:D:/Apache。
兩個TOMCAT目錄:自行解壓到(D:/TomcatCluster/)下。
分別為 tomcat6-a,tomcat6-b
三、配置
1、Apache配置
1.1 httpd.conf配置
修改APACHE的配置文件D:/Apache/conf/httpd.conf
這里并沒有使用mod_jk.so進行apache和tomcat的鏈接,從2.X以后apache自身已集成了mod_jk.so的功能。只需簡單的把下面幾行去掉注釋,就相當于以前用mod_jk.so比較繁瑣的配置了。
這里主要采用了代理的方法,就這么簡單。
將以下Module的注釋去掉
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
再找到
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
加上index.jsp修改成
<IfModule dir_module>
DirectoryIndex index.html index.jsp
</IfModule>
此處添加index.jsp 主要為了配置完成以后利用index.jsp輸出測試信息!
在 httpd.conf 最后面加入
ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=jvm1
BalancerMember ajp://127.0.0.1:9009 loadfactor=1 route=jvm2
</proxy>
上面的兩個BalancerMember成員是我們配置的tomcat集群。
1.2 httpd-vhosts.conf設置
接下來進行虛擬主機的設置。
APACHE的虛擬主機設置如下:
首先要修改 conf/httpd.conf
找到
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
把Include語句注釋去掉。改成
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
在文件(extra/httpd-vhosts.conf)最下面加入
<VirtualHost *:80>
ServerAdmin adminname
ServerName localhost
ServerAlias localhost
ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On lbmethod=bytraffic
ProxyPassReverse / balancer://cluster/
</VirtualHost>
其中的域名和路徑根據你自己情況設置
負載均衡有三種方式,可以通過設置 lbmethod 選擇自己需要的方式,詳細可查看apache文檔
proxy是位于客戶端與實際的服務器之間的服務器,一般稱為facade server,負責將外部的請求分流,也負責對內部的響應做一些必要的處理。
如果結合mod_cache,則可提高訪問速度,適當的減輕網絡流量壓力。
閑話少說,直接拿個例子來:
設本站地址為 www.test.com
ProxyPass /images/ !
ProxyPass /js/ !
ProxyPass /css/ !
ProxyPass /example http://www.example.com/
ProxyPassReverse /example http://www.example.com/
ProxyPass / ajp://127.0.0.1:8009/
ProxyPassReverse / ajp://127.0.0.1:8009/
還是上一篇的例子,ProxyPass易理解,就是轉發url上的請求,而其中的配置順序也是需要遵守。
要禁止轉發的url需要放在一般的請求之前。
對于
http://www.test.com/images/
http://www.test.com/js/
http://www.test.com/css/
的請求是不予轉發的,對于http://www.test.com/example/的請求,會轉發到http://www.example.com。
值得注意的就是ProxyPassReverse的配置了,這是反向代理。
為什么要在這里加上這樣的配置?我們來看個例子:
在沒有加這樣的反向代理設置的情況下,訪問http://www.test.com/example/a,
如果www.example.com對請求進行了redirect至http://www.example.com/b,
那么,客戶端就會繞過反向代理,進而訪問http://www.test.com/example/b。
如果設置了反向代理,則會在轉交HTTP重定向應答到客戶端之前調整它為http://www.test.com/example/a/b
即是在原請求之后追加上了redirect的路徑。
更多更詳細的關于mod_proxy的描述可以參見手冊:
http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_proxy.html
2 配置 tomcat
2.1 配置 server 的關閉
我們需要在一臺機器上跑兩個不同的 tomcat ,需要修改不同的 tomcat 的關閉口,避免出現端口被占用的情況。
其中tomcat6-a用默認值,不修改。
tomcat6-b修改。在tomcat6-b/conf下的 server.xml 中找到 server, 將:
<Server port="8005" shutdown="SHUTDOWN">
改為
<Server port="9005" shutdown="SHUTDOWN">
2.2 配置 Engine
把原來的配置注釋掉,把下面一句去掉注釋。并標明jvmRoute="jvm2"
<Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm2">
以下是原來的配置。
<Engine name="Catalina" defaultHost="localhost">
2.3. 配置 Connector
原來的默認配置。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
將tomcal6-b 中的 protocol="HTTP/1.1" 的 Connector 端口改為 8081 避免沖突。tomcat6-a 中的保持不變。
protocol="AJP/1.3" 的 Connector 是apache和tomcat鏈接的關鍵,前臺apache就是通過AJP協議與tomcat進行通信的,以完成負載均衡的作用。
也可以用HTTP協議。大家注意它們是如何連接通信的,(port="8009")就是連接的接口了。
把tomcat6-b的<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 中的port改成 9009
<proxy balancer://cluster>
#與 tomcat6-a 對應,route與<Engine jvmRoute="jvm1">對應。
BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=jvm1
#與 tomcat6-b 對應,route與<Engine jvmRoute="jvm2">對應。
BalancerMember ajp://127.0.0.1:9009 loadfactor=1 route=jvm2
</proxy>
中的端口對應,
tomcat6-a 的ajp端口port:8009
tomcat6-b 的ajp端口port:9009
一定要與上面的一致。
2.5.配置Cluster(兩個tomcat中都要修改)
原來的配置。
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
修改為以下的代碼:<Receiver port=”XX”/>port也要保證唯一性。
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"? channelSendOptions="6">
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<!--
<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="5001"
selectorTimeout="100"
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"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*/.gif;.*/.js;.*/.jpg;.*/.png;.*/.htm;.*/.html;.*/.css;.*/.txt;"/>
<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.ClusterSessionListener"/>
</Cluster>
這個設置是主要用以tomcat的集群。
tomcat集群各節點通過建立tcp鏈接來完成Session的拷貝,拷貝有同步和異步兩種模式。
在同步模式下,對客戶端的響應必須在Session拷貝到其他節點完成后進行;異步模式無需等待Session拷貝完成就可響應。
異步模式更高效,但是同步模式可靠性更高。同步異步模式由channelSendOptions參數控制,默認值是8,為異步模式,4是同步模式。
在異步模式下,可以通過加上拷貝確認(Acknowledge)來提高可靠性,此時channelSendOptions設為10。
Manager用來在節點間拷貝Session,默認使用DeltaManager,DeltaManager采用的一種all-to-all的工作方式,
即集群中的節點會把Session數據向所有其他節點拷貝,而不管其他節點是否部署了當前應用。
當集群中的節點數量很多并且部署著不同應用時,可以使用BackupManager,BackManager僅向部署了當前應用的節點拷貝Session。
但是到目前為止BackupManager并未經過大規模測試,可靠性不及DeltaManager。
四、啟動服務,測試tomcat自帶的例子
1、測試apache和tomcat協作。
先在每個tomcat中的/webapps/ROOT下的index.jsp下面加上以下的測試代碼部分:
(X代表不同的tomcat的輸出不同的信息),把index.html刪除,以免影響測試效果。
在最后面的加上.即</table></body>之間。
<%
System.out.println("tomcat6 A|B deal with request");
%>
然后再通過http://127.0.0.1來訪問一下,就會出現大家熟悉的貓貓。
然后再通過分別訪問
http://127.0.0.1:8080
http://127.0.0.1:8081
它們訪問的內容和上面的http:// 127.0.0.1是一樣的。
這樣就說明apache和TOMCAT整合成功!
2、測試均衡器
如果在 extra/httpd-vhosts.conf 中配置 沒有設置 lbmethod=bytraffic,將使用默認的 byrequests ,控制分配的一共有三種方式,還有一種是 bybusyness 。
通過http://127.0.0.1多次訪問,
如 果使用的是 byrequests 的分配方式,要想看到真正的效果,必須用一些壓力測試工具,可用微軟Microsoft Web Application Stress Tool進行簡單壓力測試,不然你靠不停刷新是體現不出來的,你只會在一個tomcat的控制臺有輸出結果。
只用用壓力測試工具模擬大量用戶同時訪問,你會發現四個tomcat控制臺均有打出控制信息,說明均衡器工作正常。
而如果配置為 bytraffic 并且tomcat6-a 和 tomcat6-b 設置了 loadfactor=1,則請求會均勻的分配給不同的tomcat,很容易測試出來。
如果想對此感興趣,請查看apache 的文檔并嘗試修改
httpd.conf
----------------------
ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=jvm1
BalancerMember ajp://127.0.0.1:9009 loadfactor=1 route=jvm2
</proxy>
----------------------
中的 loadfactor 參數和
extra/httpd-vhosts.conf
----------------------
<VirtualHost *:80>
ServerAdmin adminname
ServerName localhost
ServerAlias localhost
ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On lbmethod=bytraffic
ProxyPassReverse / balancer://cluster/
</VirtualHost>
----------------------
中的 lbmethod 參數
注意:如果apache 中出現如下錯誤
Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.
編輯httpd.conf 加入
Win32DisableAcceptEx ##加入這行
重啟apache就解決了。
如果修改后還是不行,任然有錯誤記錄,
cmd下
netsh winsock reset
使用此條命令恢復Winsock后,重啟電腦后這個問題就會解決了。
posted on 2012-06-02 08:55 gdufo 閱讀(822) 評論(0) 編輯 收藏 所屬分類: Tomcat