Linux下Apache+Tomcat搭建負載均衡服務器集群

jopen 9年前發布 | 28K 次閱讀 Tomcat Web服務器

這篇文章主要講解關于如何在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"/>
<!-- 解釋上一句代碼.
     如果主機有V*N-虛擬專用網絡,需要要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>

到此配置基本完成。

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

 來源:Mr.Pan的專欄

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!