apache整合Tomcat 集羣負載均衡配置

今天整了一下apache整合Tomcat 集羣負載均衡配置,在網上看了好多篇文章,正確的太水,在這裏我貼出我結合看了多遍文章的結果

1:Apache的安裝:這是下載地址:http://download.csdn.net/download/wangbo54979/9560498  你們也可以去Apache的官網自行下載

2:Tomcat              這是下載地址:  http://download.csdn.net/download/wangbo54979/9979752   我這是免安裝版 解壓直接用的

3:JK組件        這是下載地址:  http://download.csdn.net/download/wangbo54979/9979757  這裏是我已經改過名的mod_jk.so

你們也可以去官網下載,mod_jk-1.2.31-httpd-2.2.3.so,請下載合適的mod_jk版本,改名爲mod_jk.so

4:JDK   安裝環境變量配置就不說了

我本次測試的是2個Tomcat,分別是Tomcat1和Tomcat2

這裏面 貼出 官網的下載地址 他這版本可能和我的有點出入:

 1. Apache: apache 2.0.55 (由http://httpd.apache.org/進入下載)(點擊下載apache 2.0.55)
 2. Tomcat: Tomcat 5.5.25 (由http://tomcat.apache.org/進入下載)(點擊下載Tomcat 5.5.25 zip版)
 3. mod_jk: 在頁面 http://tomcat.apache.org/   Download 標題下找到 Tomcat Connectors 鏈接進入( 點擊下載mod_jk-apache-2.0.55.so)

Apache安裝最好不要放在C盤: 這是我隨意建的一個目錄 D:\jqtest\apatch\Apache2.2\conf

把上面下載好的mod_jk.so  放入到D:\jqtest\apatch\Apache2.2\modules  目錄下   注意找到Apache的modules 目錄 把jk丟進去就不管了 .

然後打開conf下的 httpd.conf文件 :

 需要注意的是:Listen 80  他有個這個監聽端口,就是你的服務器支持哪個寫哪個,但一般服務器都支持80端口所以就不用管,除非個別網絡服務商把,你當前所在的區域80端口給屏蔽了,那你就得調換端口了

一直 拖拖到httpd.conf文件的最下面加入 :Include C:\java\work\mod_jk.conf  我這裏就隨便找了個位置 存放了 這個文件裏面配置一些信息 如下:

LoadModule jk_module modules/mod_jk.so  剛剛說丟到Apache下面modules目錄的JK組件
LoadModule rewrite_module modules/mod_rewrite.so   這個Apache modeles裏面自帶有
JkWorkersFile conf/workers.properties    這個文件需要自己 新建 放到Apache conf目錄下的
JkLogLevel info

workers.properties文件:

#server
worker.list = controller
#========tomcat1========
worker.tomcat1.port=9030
worker.tomcat1.host=127.0.0.1
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1
#========tomcat2========
worker.tomcat2.port=9031
worker.tomcat2.host=127.0.0.1
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1

  
#========controller,負載均衡控制器========
####負載均衡控制器,類似一個虛擬的worker,type必須是lb
worker.controller.type=lb


####負載均衡集羣中所有的tomcat都在這裏了
worker.controller.balance_workers=tomcat1,tomcat2


#### 多個tomcat之間session的處理,使用不使用sticky的方式
worker.controller.sticky_session=false


#第二個參數是如果掉線了則把當前SESSION複製到別的TOMCAT
worker.controller.sticky_session_force=false
worker.controller.sticky_session=1

 

好了work文件就這些配置 然後在回到 mod_jk.conf 開始配置 JK訪問方式:

在文件原有的基礎上,拖到最後面 添加代碼如下:

<VirtualHost *:80>
         ServerAdmin [email protected]
         ServerName localhost
         ServerAlias localhost
         DocumentRoot  /opt/apache2.4/htdocs/test
         JkMount  /*.do controller
	 JkMount  /*.jsp controller
         ErrorLog "logs/loadbalancer-error.log"
         CustomLog "logs/loadbalancer-access.log" common
</VirtualHost>


tomcat1 的配置: 爲了方便能看懂我就全部 貼出來 下面是server.xml文件

<?xml version='1.0' encoding='utf-8'?>
<Server port="9010" shutdown="SHUTDOWN">  <!--2個Tomcat的這個端口不要一樣-->

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <GlobalNamingResources>

    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">

    <Connector port="9020" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" URIEncoding="UTF-8"/>  <!--這裏面的9020就不說了 就跟8080一個意思  8433不能動-->

    <Connector port="9030" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
    <!-- 上面的9030 注意2個Tomcat不要一樣-->	
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> <!--在正常的Tomcat裏面你會發現其實這行是註釋的-->        
      <!--還是上面這行的解釋,你會發現有一個跟他一樣的代碼 只是沒有 jvmRoute 這裏配置的要跟work文件裏面對上 註釋沒有jvmRoute的開啓有的-->
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
       <!--上面這行 正常情況下是註釋的 在這裏爲了完成Tomcat的複製,把註釋放開-->  
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

      </Host>
    </Engine>
  </Service>
</Server>
還有 爲了能讓session複製 還需要配置一個文件context.xml 裏面把Context  加上dis...ble的 <Context  distributable="true">
或者你也可以在web項目的web.xml文件裏面加<distributable/>也行

tomcat2:配置跟1是一樣的 只是端口不一樣 ,我還是貼出來吧 但是沒說明因爲和上面一樣

<?xml version='1.0' encoding='utf-8'?>

<Server port="9011" shutdown="SHUTDOWN">

 
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

 
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">
  
    <Connector port="9021" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" URIEncoding="UTF-8"/>
   
    <Connector port="9031" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>


   
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">         
 
   
 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
    
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">


      </Host>
    </Engine>
  </Service>
</Server>

還有2個文件裏面都有一個 cs.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>");
  // 如果有新的 Session 屬性設置
  String dataName = request.getParameter("dataName");
  if (dataName != null && dataName.length() > 0) {
     String dataValue = request.getParameter("dataValue");
     session.setAttribute(dataName, dataValue);
  }
  out.println("<b>Session 列表</b><br>");
  System.out.println("============================");
  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="test2.jsp" method="POST">
    名稱:<input type=text size=20 name="dataName">
     <br>
    值:<input type=text size=20 name="dataValue">
     <br>
    <input type=submit>
   </form>
</body>
</html>


上面講的是JK配置方式,如果操作無誤。Apache是可以正常啓動的,並且啓動2個Tomcat是可以自由分配的,因爲下面我還要說明2種方式實現,最終的運行結果圖 最後貼出:

下面說明ajp_proxy 方式配置:

去掉httpd.conf文件中下面內容的註釋(刪掉#號),開啓下邊的配置

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.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

注意:
除了mod_proxy.so,mod_proxy_balancer.so,mod_proxy_connect.so
如果是採用ajp_proxy,需要加載mod_proxy_ajp.so這個模塊;
如果是採用http_proxy,需要加載mod_proxy_http.so這個模塊;

在剛剛配置好的httpd.conf文件最下面加入:

ProxyRequests Off
<proxy balancer://controller>  #controller 很明顯是剛剛work文件裏面配置的
	BalancerMember ajp://127.0.0.1:9030 loadfactor=1 route=tomcat1   #這個Tomcat1 也是work文件配置的還有9030端口也是
	BalancerMember ajp://127.0.0.1:9031  loadfactor=1 route=tomcat2
</proxy> 


這裏講的是ajp的配置方式,所以需要刪除mod_jk.conf裏面原有的配置然後加上:

LoadModule jk_module modules/mod_jk.so
LoadModule rewrite_module modules/mod_rewrite.so
JkWorkersFile conf/workers.properties
JkMount  /*.do controller
JkMount  /*.jsp controller
JkLogLevel info

<VirtualHost *:80>
         ServerAdmin [email protected]
         ServerName localhost
         ServerAlias localhost
         ProxyPass / balancer://controller/ stickysession=jsessionid nofailover=On
         ProxyPassReverse / balancer://controller/   #controller 是work文件裏面配置的
         ErrorLog "logs/loadbalancer-error.log"
         CustomLog "logs/loadbalancer-access.log" common
</VirtualHost>

這就配置完了ajp的訪問方式,重啓Apache如果不報錯,說明配置成功,如果有錯請根據Apache目錄logs目錄的日誌文件調錯


下面來講http的方式配置:

爲了節約時間我這裏就簡單粗暴的 處理了。

刪除httpd.conf下面 加的所有 代碼,注意 上面說解開註釋的那6行代碼別刪了  

我這裏 就直接不要 mod_jk.conf 文件 直接都寫到 httpd.conf下面了

LoadModule jk_module modules/mod_jk.so
LoadModule rewrite_module modules/mod_rewrite.so
JkWorkersFile conf/workers.properties
JkMount  /*.do controller
JkMount  /*.jsp controller
JkLogLevel info
ProxyRequests Off
<proxy balancer://controller> 
	BalancerMember http://127.0.0.1:9020 loadfactor=1 route=tomcat1  #需要注意的是這裏以前是ajp切換成了http 
	BalancerMember http://127.0.0.1:9021  loadfactor=1 route=tomcat2  #還有這個端口就不是對應的以前那個9030端口了
</proxy> 

下面貼出運行結果: 我這裏採用的ajp方式;






上面Tomcat配置中 改一下 :<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">改成下面的

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="6">

          <Manager className="org.apache.catalina.ha.session.BackupManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"
                   mapSendOptions="6"/>

          <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="5000"
                      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>


最後說一點:找到apatch裏面conf下面的httpd.conf 文件下面的這段代碼  

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

改成這樣,不然在配置靜態資源的時候是訪問不到的  提示你沒權限訪問

<Directory />
Options FollowSymLinks
    AllowOverride None
Order allow,deny
    Allow from all
</Directory>

熱情提醒一下:  不要開防火牆啊 .......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章