WINDOWS 下apache與tomcat6集成
準備工作:
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方式。
無論使用哪種方式,一般都要經過以下這幾個步驟(同一臺機器):
- 修改startup.bat中的CATALINA_HOME變量的值。因爲每個Tomcat實體的CATALINA_HOME都是不一樣的,如果設置爲系統的環境變量,那麼在啓動這幾個Tomcat時就會出問題。
- 設置不同的Tomcat服務器(啓動)端口
- 對不同的Tomcat實體設置不同的AJP connector
- 停止Coyote HTTP/1.1 連接器(Http請求交給Apache Http Server處理)
- 在Standalone Engine中設置jvmRoute
- 註釋掉Catalina Engine
- 在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中配置Tomcat與Apache
注:粗體字爲與負載均衡有直接關係的配置語句
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 了