gdufo

           

          TOMCAT6配置負載均衡和集群 _2

          http://blog.csdn.net/dangerous_fire/article/details/6278435

          最近要配置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有關,有網友也出現了這個問題,他認為是金山毒霸或者升級精靈修改了WINSOCK導致的。我沒有安裝但是系統經常自動更新,別的軟件也有,可能會有沖突。
          使用此條命令恢復Winsock后,重啟電腦后這個問題就會解決了。

          posted on 2012-06-02 08:55 gdufo 閱讀(822) 評論(0)  編輯  收藏 所屬分類: Tomcat

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 古蔺县| 罗山县| 明水县| 金川县| 太湖县| 个旧市| 锦屏县| 察雅县| 临城县| 永登县| 百色市| 泗洪县| 中西区| 墨玉县| 临清市| 廊坊市| 鄂温| 方城县| 洞头县| 工布江达县| 绍兴县| 蒲城县| 平度市| 文安县| 鹤壁市| 井研县| 密云县| 昆山市| 陆河县| 五家渠市| 朝阳市| 临朐县| 仙游县| 大冶市| 周宁县| 邹城市| 新安县| 于都县| 和林格尔县| 泰宁县| 滦南县|