Apache與Tomcat6 的負載均衡(使用mod_jk.so)

WINDOWS apachetomcat6集成 

準備工作:

1.下載apache_2.2.4-win32-x86-no_ssl.msi  下載地址http://httpd.apache.org/  需要自己找或者度娘;

2.下載jk_mod.so下載http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/

對應的版本tomcat-connectors-1.2.32-windows-i386-httpd-2.2.x.zip 根據這個包可以知道,1.2.32對應的httpd爲2.2.x的,不然會有想不到的問題;

3.下載jdk1.6安裝就不介紹了,一般完這個的都會;

4.下載tomcat6 下載地址爲:http://tomcat.apache.org/download-60.cgi,地址有時候會變動,請根據實際情況下載;

 

一般來說,實現Apache與Tomcat6的負載均衡有兩種方式,一種是使用mod_jk,另一種是使用mod_proxy模塊。本文只討論mod_jk方式。

無論使用哪種方式,一般都要經過以下這幾個步驟(同一臺機器):

  1. 修改startup.bat中的CATALINA_HOME變量的值。因爲每個Tomcat實體的CATALINA_HOME都是不一樣的,如果設置爲系統的環境變量,那麼在啓動這幾個Tomcat時就會出問題。
  2. 設置不同的Tomcat服務器(啓動)端口
  3. 對不同的Tomcat實體設置不同的AJP connector
  4. 停止Coyote HTTP/1.1  連接器(Http請求交給Apache Http Server處理)
  5. 在Standalone Engine中設置jvmRoute
  6. 註釋掉Catalina Engine
  7. 在worker.properties中配置Tomcat worker

下面來詳細說下詳細的配置步驟

 

1.Tomcat startup.bat中修改CATALINA_HOME的值

注:這一步跟負載均衡沒關係,沒有負載均衡也要進行這一步

首先下載Tomcat6.*.*.zip,解壓後進行重命名,複製三個,分別是Tomcat6A,Tomcat6B,Tomcat6C名字可以修改,不過需要跟後面的對應不然會出問題

startup.bat只是在.zip格式的Tomcat壓縮包裏纔有,使用安裝包安裝的好像沒有。找到這個文件,打開後修改

1.對與Tomcat6A

set CATALINA_HOME=%CURRENT_DIR%爲set CATALINA_HOME= E:\tomcat\Tomcat6A

2.對於Tomcat6B

set CATALINA_HOME=%CURRENT_DIR%爲set CATALINA_HOME= E:\tomcat\Tomcat6B、 

3.對於Tomcat6C

set CATALINA_HOME=%CURRENT_DIR%爲set CATALINA_HOME= E:\tomcat\Tomcat6C

如果沒有找到可能是因爲有引號一樣的修改方式參考:

set “CATALINA_HOME=%CURRENT_DIR%”改爲set "CATALINA_HOME=E:\tomcat\Tomcat6A"

2.設置不同的服務器端口

注:這一步與負載均衡沒有直接關係,是爲了處理多個Tomcat的問題,如果這些Tomcat分佈在不同的機器上,應該不會有這個問題

打開三個tomcat下面的conf/server.xml,找到下面這個標籤:

<Server port="8005" shutdown="SHUTDOWN" debug="0">

在本例中, Tomcat6A使用8005端口

Tomcat6B使用8006端口

Tomcat6C使用8007端口

3.設置Tomcat中的AJP連接器接口

注:這是第一步跟負載均衡直接相關的步驟

打開三個tomcat下面的conf/server.xml,找到這樣一個xml標籤:

<!--Define an AJP1.3 connector on port 8009-->

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443">

在本例中, Tomcat6A使用8009端口

Tomcat6B使用8010端口

Tomcat6C使用8011端口

4.停止監聽默認的Http/1.1連接器

注:這步也是和負載均衡直接相關,但不是負載均衡中的關鍵,只是個副產品(byproduct)

爲了防止人們直接訪問某個Tomcat(因爲這樣會使負載均衡器失去意義),所以我們要關掉它的HTTP連接器,使得這些Tomcat只能通過AJP協議接收Apache轉發過來的請求,因此需要停止HTTP/1.1連接器

打開三個tomcat下面的conf/server.xml,像下面的代碼這樣註釋掉HTTP/1.1連接器的監聽

<!--Define

<Connector port="8080" protocol="HTTP/1.1"

maxThreads="150" connectionTimeout="20000"

redirectPort="8443 />"

-->

5.Standalone Engine中設置jvmRoute屬性

注:這是實現負載均衡的關鍵一步,這一步做了兩件事,一是配置了Standalone Engine,二是賦予這個Engine一個id:jvmRoute

每個Tomcat worker的conf/server.xml中都有有關Engine的配置(語句)。這個Engine是一個和Catalina Engine一樣級別最高的Engine,代表整個Catalina Servlet Engine。這條配置語句在conf/server.xml中,jvmRoute的值必須是唯一的,在本例中,各個Tomcat實例的配置如下

Tomcat6A

<!--You should set jvmRoute to support load-balancing via AJP-->

<Engine name="Standalone" defaultHost="localhost" jvmRoute="Tomcat6A">

Tomcat6B:

<!--You should set jvmRoute to support load-balancing via AJP-->

<Engine name="Standalone" defaultHost="localhost" jvmRoute="Tomcat6B">

Tomcat6C:

<!--You should set jvmRoute to support load-balancing via AJP-->

<Engine name="Standalone" defaultHost="localhost" jvmRoute="Tomcat6C">

6.註釋掉Catalina Engine

注:這一步其實可以和上一步合併

因爲我們在tomcat上配置了Standalone Engine,因此需要註釋掉Catalina Engine。具體做法是:在conf/server.xml中找到相應代碼進行註釋,結果如下:、

<!--

<Engine name=-"Catalina" defaultHost="localhost">

-->

7.httpd.conf中配置TomcatApache

 

注:粗體字爲與負載均衡有直接關係的配置語句

1.在Apache Http Server下的conf文件夾中打開httpd.conf,添加下面的語句到其末尾

 Include conf/mod_jk.conf

2. 在apache的conf下面創建mod_jk.conf,並添加內容,以下是我配置的原樣:

#加載mod_jk Module這裏可能會找不到mod_jk.so,需要手動添加進來

LoadModule jk_module modules/mod_jk.so

#指定 workers.properties文件路徑

JkWorkersFile conf/workers.properties

#打印日誌等級

JkLogLevel  error

#日誌查看地址可以自己設置

JkLogFile "D:\Program Files\Apache Software Foundation\Apache2.2\logs "

#所有的行分流

JkMount /examples/jsp /* controller

JkMount /jkstatus/ status1

3. 在apache的conf下面創建workers.properties文件,並添加內容

以下內容是我配置的原樣本:按此段第二條的的配置位置創建

worker.list=controller,status1

 

worker.Tomcat6A.type=ajp13

worker.Tomcat6A.host=10.0.0.53

worker.Tomcat6A.port=8009

worker.Tomcat6A.lbfactor=10

 

worker.Tomcat6B.type=ajp13

worker.Tomcat6B.host=10.0.0.53

worker.Tomcat6B.port=8010

worker.Tomcat6B.lbfactor=10

 

worker.Tomcat6C.type=ajp13

#tomcat的主機地址,如不爲本機,請填寫ip地址

worker.Tomcat6C.host=10.0.0.53

#ajp13 端口號,在tomcat下server.xml配置,默認8009

worker.Tomcat6C.port=8011

#server的加權比重,值越高,分得的請求越多

worker.Tomcat6C.lbfactor=10

 

worker.controller.type=lb

worker.controller.sticky_session=1

worker.controller.balance_workers=Tomcat6A,Tomcat6B,Tomcat6C #每次增加個tomcat 需要在這裏添加一個,這裏的名字對應上面的名字

worker.status1.type=status #這裏是看配置查看apache負載的詳細情況的

 

說明:在workers.proterties中每一個Tomcat實例一般有這幾個屬性需要配置,分別是:

type(類型):

一般有ajp13(代表Tomcat的worker),lb負載

host(主機): Tomcat所在機器的ip地址(這裏的host值就是自己機器的ip地址,需要查看自己的機器的ip地址來替代這個地址)

port(端口): worker所監聽的端口號

lbfactor(負載權重):影響負載均衡器在分發請求時所分配的請求數,相對大小更重要

sticky_session屬性設爲1,這樣負載均衡器lb就會盡量保持一個session,也就是使用戶在一次會話中跟同一個Tomcat進行交互。(我猜如果不能保持跟同一個Tomcat進行交互,也就不能保持一個session)。

balance屬性可以告訴mod_jk模塊那些worker由lb負載均衡器控制

 

 

8.測試配置是否成功

在Tomcat的目錄下找到webapps/examples/jsp/目錄下創建一個index.jsp文件,內容如下:

TomcatA

<%@page language="java"%>

<html>

  <body>

    <h1>Index Page Of Tomcat6A</h1>

  </body>

</html>

其他兩個Tomcat所做的操作類似,只是index.jsp中的內容變了一下,分別是:

TomcatB:

<%@page language="java"%>

<html>

  <body>

    <h1>Index Page Of Tomcat6B</h1>

  </body>

</html>

 

TomcatC:

<%@page language="java"%>

<html>

  <body>

    <h1>Index Page Of Tomcat6C</h1>

  </body>

</html>

配好後,重啓Tomcat和Apache Http Server,順序爲 關閉Apache->關閉Tomcat->啓動Tomcat->啓動Apache

在瀏覽器中輸入http://localhost/examples/jsp/index.jsp,然後運行多個瀏覽器實例(同一個瀏覽器的標籤式瀏覽不行,因爲很多標籤式瀏覽被設置爲共享session),如果出現不同的頁面,就說明負載均衡配置成功了。

在瀏覽器中輸入http://localhost/jkstatus/,,將出現目前負載情況的統計資料,如下圖所示:

 

 

 

8.異常信息

安裝的時候總會有點小問題:

1.apache啓動的時候報錯:the requested operaion has failed!

原因一:80端口占用
例如IIS,另外就是迅雷。我的apache服務器就是被迅雷害得無法啓用!


原因二:軟件衝突

裝了某些軟件會使apache無法啓動如Dr.com 你打開網絡連接->TcpIp屬性->高級->WINS標籤把netbios的lmhosts對勾去掉,禁用tcp/ip的netbios. 然後再啓動應該就可以了。


原因三:httpd.conf配置錯誤

如果apache的配置文件httpd.conf搞錯了,在windows裏啓動它,會提示the requested operation has failed ,這是比較鬱悶的事,因爲查錯要看個半天。

其實可以用命令行模式啓動apache,並帶上參數,apache會提示你哪句有誤,然後就可以針對性的解決,命令如下:
httpd.exe -w -n "Apache2" -k start

還有一種情況:

即使你這次啓動了,下次你都有可能啓動失敗

在運行裏輸入:
netsh winsock reset
一會兒cmd會提示你重啓,不用理會,現在APACHE已經可以啓動了。

其實就是一個winsock的修復

2.路徑問題:httpd.exe:Syntax error on line

 

這個是配置問題,根據提示一般能解決問題的

其中我就碰到了配置文件問題,參考文檔裏面有個單詞少了一個,害的我停止了半天,不過還是謝謝他的文檔,至少大部分都沒有問題,在他的基礎上做了小小改動,所以爲了自己學習的歷史長河,記錄下這個小小的浪花;

 

 3.apache修改端口,找到httpd.conf裏面的:Listen 80  修改爲對應的Listen 8088就OK 了

 

 

 

 

 

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