Apache + Tomcat 實現負載均衡


在北京工作已經也有了兩年的時間,做過質量管理軟件,做過金融,現在又做到了互聯網。看看blog好久沒有自己寫點東西了,不像剛開始接觸java的時候每天還會寫點東

西,可能是懶了,也可能覺得自己寫得東西不一定會給別人帶來幫助......我不是一個善於面試的人,因爲我的基礎不好,java也是自己看着視頻學得,其他的東西都是在工作中學得

總覺得面試的時候有點力不從心。。。


今天寫得東西就是關於面試的時候一個面試人員問我的問題。用過apache麼?我說沒用過。用過tomcat麼?我說用過。apache+tomcat如何實現負載均衡?不知道。。。

又是一問三不知。回來自己看了看網上的文章自己搞了搞。勉強算是搞起來了。下面就寫出來。希望和我一樣的人能可以搞出來點東西,學到一點自己想學得東西。


我的環境用得是apache2.2 + tomcat 7 負載均衡器爲:mod_jk 具體的下載鏈接我也忘記了。。。。baidu就好了。 下面我們開始搭配環境。


1.安裝apache。

2.我是apache掛了3個tomcat。所以下載tomcat的時候最好是zip形式的。解壓出來,這樣比較方便。解壓3個tomcat分爲別tomcat1,tomcat2,tomcat3

3.找到apache的所在目錄,在conf文件夾下找到httpd.conf這個配置文件。打開這個配置文件,定位到最後一行加入如下代碼:

Include conf/mod_jk.conf

如圖:


這裏的路徑也可以寫爲絕對路徑,網上也有得資料寫得是絕對路徑,但是我測試的時候寫成這樣也可以我就寫成了這個樣子。

4.在conf文件夾下建立mod_jk.conf文件。建立完成後加入如下代碼:

LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
#制定哪些請求交給tomcat處理,"controller"爲在workers.properties裏制定的負載分配器名
JkMount /*.* controller

如圖:

裏面的含義我想大概看下應該就會明白,具體我也沒有深究,個人覺得 

LoadModule jk_module modules/mod_jk.so 含義:指定加載Module爲jk_module 路徑在modules下得mod_jk.so文件

JkWorkersFile conf/workers.properties 指定workers的配置文件的所在位置爲conf下得workers.properties

JkMount /*.* controller 爲指定哪些請求交給tomcat進行處理,這個controller爲workers.properties裏面指定的負載分配器名字。這裏有一個需要大家注意的地方,

我再測試的時候寫得是*.jsp,這樣凡是jsp爲結尾的訪問方式都會交給tomcat進行處理。但是這裏會有一個問題,當你的頁面上面帶有圖片的時候是無法顯示的

,而且頁面上面加載的*.js,*.css也是無法加載的,這是爲什麼呢?個人覺得原因是,配置的只是*.jsp交給tomcat進行處理,而圖片啊,js的結尾爲*.jpg,*.js等

apache沒有轉發給tomcat,而是在自己的路徑下找沒有找到相應的圖片和js,所以加載不成功。解決這個問題的方法爲:1.和我上面的方法一樣配置*.*全部交給

tomcat進行處理,但是我覺得這樣的方式肯定不是主流的方式,因爲這樣在你每個項目下的tomcat都要有相應的東西。2.我認爲可以把這些東西放到apache下

tomcat只是處理解析動態的代碼也就是jsp,這樣問題應該就相應解決了。因爲我也是初學有得地方不一定對,希望看到我的文章的朋友如果是大牛可以對我進行

一下指導,如果是和我一樣初學的人可以一起研究。

5.配置完上面的東西我們需要在到conf目錄下創建一個workers.properties文件。文件中的內容爲:

#server
worker.list = controller

#=========tomcat1=======
worker.tomcat1.port=11009
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1
#=========tomcat2=======
worker.tomcat2.port=12009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
#=========tomcat3=======
worker.tomcat3.port=13009
worker.tomcat3.host=localhost
worker.tomcat3.type=ajp13
worker.tomcat3.lbfactor=1
#=========tomcat4=======
##可以設置遠程服務器,設置方法host爲ip地址
#===========controller,負載均衡控制器====
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3
worker.controller.sticky_session=false
worker.controller.sticky_session_force=1
worker.controller.sticky_session=1

如圖:


值得注意的是這裏的controller要與mod_jk.conf中配置的名字一樣。下面爲配置tomcat我的3個tomcat都在本地,如果tomcat有一個

遠程服務器只需要將host變爲ip地址即可。

worker.tomcat3.type=ajp13指定worker tomcat3的通訊方式爲ajp13

worker.tomcat3.lbfactor=1爲指定權重,值越大處理的時候分到的請求就越多。

worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3爲指定分擔請求的tomcat

worker.controller.sticky_session=1 表述是否將對session id的請求路由回到相同的tomcat worker,如果屬性值不爲0,它將被設置爲jk_true

session將是粘性的,即session id的請求路由回到相同的tomcat worker。當tomcat正使用能夠跨越多個tomcat實例持久化session數據的

session manager的時候,她將被設置爲jk_false 屬性默認爲jk_true;


6.配置好上面以後將下載好的 “tomcat-connectors-1.2.32-windows-i386-httpd-2.2.x”中得mod_jk放到apache目錄中得modules下。

注意選擇這個connectors文件的時候需要和你的apache版本要匹配不然會出現問題。


7.下面我們來修改tomcat的配置文件。到tomcat/conf文件夾中修改server.xml文件。

如圖:


此處需要注意的是。這個AJP/1.3的port的端口號要和你的worker配置文件中得端口號相同,此端口號最大支持5位。多了會報錯,

而且還需要保持Http/1.1的端口號不能重複。不然的話不能掛載的tomcat同時啓動。還有jvmRoute的的參數爲worker中配置的。


做完上面的工作我們的環境基本算是搭建成功了。下一步就是進行測試了。

建立一個test項目,分別放到你掛的幾個tomcat下。

建立一個test.jsp內容爲:

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<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="test.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>
同時修改web.xml添加<distributable/>


然後啓動apache,與tomcat訪問頁面看結果嘍。。。。。。希望大家可以成功。
大笑


ps:菜鳥一隻,如果有不對的地方希望大牛指點與提攜。


session複製,需要在上述的配置中engine後加入:


<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
                <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="4001"
                                autoBind="100"
                                selectorTimeout="5000"
                                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=""/>
                <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
    
                <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
                <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>


發佈了49 篇原創文章 · 獲贊 7 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章