Linux下Apache+Tomcat搭建負載均衡伺服器叢集

Mr.Pan的專欄發表於2015-03-13

這篇文章主要講解關於如何在Linux下搭建Apache+tomcat負載均衡伺服器叢集的過程。

負載均衡叢集配置(1):Tomcat的配置

修改“ tomcat/conf/server.xml ”檔案
編輯server.xml檔案,找到“<Connector>”元素節點,在server.xml檔案裡面未註釋掉的有兩個<Connector>元素節點。找到第二個也就是上面一行註釋為

<!-- Definean AJP 1.3 Connector on port 8009 -->

的節點。將其修改為

<!-- Define an AJP 1.3 Connector on port 8009 -->
 <Connector port="8009" protocolhandlerclassname="org.apache.jk.server.jkcoyotehandler" protocol="AJP/1.3" redirectPort="8443" />

注意:如果是在一臺PC上同時執行多個tomcat,須將每個tomcat對的server.xml檔案裡面的“<Connector>”元素節點裡面的port(埠號)設定為不同的值。這裡不同上面只改第二個,而是兩個“<Connector>”元素節點都須要修改。

負載均衡叢集配置(2):

接下來繼續修改這個檔案,找到“<Connector>”元素節點下面的註釋如下

!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->
    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->

裡面有

<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

將其註釋開啟。這裡進行tomcat的命名,即修改jvmRoute的值為tomcat例項名,不同的tomcat設定不同的值(這裡不管是否是同一PC都須不同)。比如我的修改為tomcat1和tomcat2

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1" >

負載均衡叢集配置(3):

接下來還是操作tomcat的server.xml檔案,在<Engine><Host>元素節點下新增以下內容

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
        <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.1.99" 
              port="45564"
              frequency="500"
              dropTime="3000"/>
          <Receiver 
                  className="org.apache.catalina.tribes.transport.nio.NioReceiver"
              address="192.168.11.128"                                                        port="4002"
              autoBind="100"
              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"/>
       </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>

上述新增的程式碼的用處請繼續看第4步。

負載均衡叢集配置(4):

這裡還是繼續操作tomcat的server.xml檔案
找到剛剛新增的一長串程式碼中的<Cluster>元素節點,下面開始修改,程式碼意義見其中的註釋解釋

<Membership
     className="org.apache.catalina.tribes.membership.McastService"
     address="228.0.1.99" 
     port="45564"
     frequency="500"
     dropTime="3000"/>
<!-- 解釋上一句程式碼.
     如果主機有vpn-虛擬專用網路,需要要bind下,即新增  bind="127.0.0.1" 在Membership元素節點裡面作為屬性。如果沒有的話可以不用加bind,否則會導致session無法複製.
     address的值表示廣播地址,同一組tomcat搭建的叢集配置須一樣。
     port埠號,同一組tomcat搭建的叢集配置須一樣。
 -->
<Receiver 
     className="org.apache.catalina.tribes.transport.nio.NioReceiver"
     address="192.168.11.128"                                                   
     port="4002"
     autoBind="100"
     selectorTimeout="100"
     maxThreads="6"/>
<!-- 解釋上一句程式碼.
     address的值表示本機IP地址,須設定為本機IP地址。
     port埠號(tomcat預設可以檢測到4000~4100之間的埠)。如果是在同一臺PC上配置負載均衡則需要修改,使用不同的埠號,否則會因為埠衝突而失效。
-->

負載均衡叢集配置(5):專案部署檔案的配置

修改待發布專案的web.xml
找到專案的web.xml檔案,開啟修改,在<web-app>元素節點結束標籤上面一行新增

<distributable/>

從而確保session能夠複製。

負載均衡叢集配置(6):Apache的配置

接下來進行Apache配置檔案的修改,找到Apache安裝資料夾下面的conf資料夾裡面的httpd.conf檔案開啟並進行修改,在最後面加上一下內容

#載入mod_jk Module
LoadModule jk_module modules/mod_jk.so
<Ifmodule mod_jk.c>
#指定workers.properties檔案路徑
JkWorkersFile /usr/local/apache2/conf/workers.properties
#指定jk logs檔案存放位置
JkLogFile /usr/local/apache2/logs/mod_jk.log
#Set the jk log level [debug/error/info]
JkLogLevel info
#Select the log format
JkLogStampFormat "[%a %b %d%H:%M:%S %Y]"
#JkOptions indicate to send SSL KEYSIZE,
JkOptions  +ForwardKeySize +ForwardURICompat -ForwardDirectories
#JkRequestLogFormat set the requestformat
JkRequestLogFormat "%w %V %T %q %U%R"
#JkShmFile to put logs
JkShmFile /usr/local/apache2/logs/mod_jk.shm
</IfModule>
#指定哪些請求交給tomcat處理,哪些請求交給apache處理
#注意:" loadbalancer "為在workers.propertise裡指定的負載分配控制器
JkMount /*.jsp loadbalancer 
#所有的jsp都交給tomcat處理

負載均衡叢集配置(7):

在上一步中新增的httpd.conf檔案的最後新增的配置中的workers.properties檔案是不存在的,需要我們在指定的位置建立一個,檢視上一步可以發現檔案在 /usr/local/apache2/conf/路徑下面建立。
workers.properties檔案用於對負載均衡的負載器worker(即tomcat)進行具體的登記,此處的2個tomcat就作為2個worker被登記在這個檔案中。
workers.properties具體配置如下:

#workers.properties
#
# in unix, weuse forward slashes:
ps=/
# workers 列表
worker.list=tomcat1,tomcat2,tomcat3,loadbalancer,status
#--------------------------------------------------------------------
# 第一個tomcat
#--------------------------------------------------------------------
worker.tomcat1.port=8009   #對應tomcat的server.xml中配置的ajp13埠號
worker.tomcat1.host=127.0.0.1  #tomcat1的主機地址,如不為本機,請填寫IP地址
worker.tomcat1.type=ajp13  #定向包協議
worker.tomcat1.lbfactor=1  #server的負載分配權重,值越高,分得的請求越多
#以下為非必要配置,這部分配置tomcat2的配置同tomcat1
#worker.tomcat1.cachesize=1000  #配置tomcat的jk連線快取大小 (非必要)
#worker.tomcat1.cachesize_timeout=600  # (非必要)
#worker.tomcat1.reclycle_timeout=300  # (非必要)
#worker.tomcat1.socket_keepalive=1  #防止防火牆切斷未啟用的網路連線(非必要)
#worker.tomcat1.socket_timeout=300   #(非必要)
#worker.tomcat1.local_worker=1  # (非必要)
#worker.tomcat1.retries=3  # (非必要) 
#----------------------------------------------------------------------
# 第二個tomcat
#----------------------------------------------------------------------
worker.tomcat2.port=8809
worker.tomcat2.host=127.0.0.1  #tomcat2的主機IP地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
#---------------------------------------------------------------------
#第三個tomcat,使用其他ip對應的tomcat
#---------------------------------------------------------------------
worker.tomcat3.port=8009
worker.tomcat3.host=192.168.11.128
worker.tomcat3.type=ajp13
worker.tomcat3.lbfactor=1
#----------------------------------------------------------------------
# load balancerworker -負載均衡控制器
# --------------------------------------------------------------------
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1,tomcat2,tomcat3
#指定分擔請求的tomcat
worker.loadbalancer.sticky_session=1    #設定為粘性session
worker.loadbalancer.sticky_session_force=0  #設定當多次請求未響應,請求將轉發
worker.status.type=status
#
# end workers.properties

負載均衡叢集配置(8):

修改Apache安裝陌路下的conf資料夾裡的httpd.conf檔案。
開啟httpd.conf檔案並修改。找到DocumentRoot和Directory並修改,將檔案訪問路徑定位到tomcat的webapps資料夾,即待發布專案的存放位置

#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/usr/local/tomcat1/webapps"
<Directory "/usr/local/tomcat1/webapps">
   Require all granted
   Orderallow,deny
   Allow from all
</Directory>

到此配置基本完成。

下面就是測試的環節了。在此就不多說了。

相關文章