Aphache + Tomcat 集羣

apache與tomcat及整合實現負載均衡及集羣(轉)


(1)apache與tomcat的區別:
Apache是一個web服務器環境程序,可以作爲web服務器使用。不過只支持靜態網頁,如(asp,php,cgi,jsp)等動態網頁的就顯得無能爲力。
如果想讓服務器也能處理動態頁面,那麼就需要Tomcat。
當處理靜態頁面時,Tomcat不如Apache迅速。Tomcat不象Apache一樣可配置(如:可以作爲一個代理服務器,即loadbalaner)。
Tomcat不象Apache一樣強壯。
基於以上原因,一個現實的網站使用一個Apache作爲Web服務器,爲網站的靜態頁面請求提供服務;並使用Tomcat服務器作爲一個Servlet/JSP插件,顯示網站的動態頁面。
apache+tomcat是企業級的應用 ! ---->採用apache+tomcat結合應用 !
1.Apache主要用來解析靜態文本,如html,tomcat也有此功能,但apache能大大提高效率,對於併發數較大的企業級應用,能更好的顯示apache的高效率;
2.Tomcat 用來解析jsp,servlet等,所有的客戶請求首先會發送到apache,如果請求是靜態文本則由apache解析,並把結果返回給 客戶端,如果是動態的請求,如jsp,apache會把解析工作交給tomcat,由tomcat進行解析(這首先要兩者現實整合),tomcat解析完 成後,結果仍是通過apache返回給客戶端,這樣就可以達到分工合作,實現負載均衡,提高系統的性能!

(2)用apache實現html和jsp文件分離訪問:
apache在處理靜態頁面及資源文件(圖片,CSS文件)的優勢-->作爲圖片服務器,將動態頁面請求由apache轉發到應用服務器tomcat緩解了大併發量下,應用服務器的壓力。
默認是不需要配置的,也就是說你把需要給tomcat處理的後綴在配置文件(httpd.conf)中寫好,那麼剩下的就都是apache處理的了。
將要默認處理的html文件放於apache默認的發佈目錄下即可。
apache所有的配置,都在httpd.conf中。
配置端口:
Listen 80  #Listen 127.0.0.1:8080
DocumentRoot:
應該是定義這個服務器對外發布的超文本文檔存放的路徑, --》可以修改爲任何其它路徑。
DocumentRoot "F:/loadBalance/apache/Apache2/htdocs"
也可以自定義虛擬容器。如下面第3點。

(3)自定義apache的發佈目錄:
通過修改Apache的配置文件%APACHE2_HOME%/conf/httpd.conf可以定置自己的Apache服務器。注意修改該配置文件前要先停止正在運行的Apache服務器。
在相應位置增加以下行可以定義自己的文件系統容器,設置自己的本地文件系統到網絡空間的映射:
Alias /homepage "D:/heavyz/homepage"
<Directory "D:/heavyz/homepage">
Options Indexes FollowSymLinks -ExecCGI
DirectoryIndex index.php index.html home/index.php home/index.html
Order allow,deny
Allow from all
Deny from enpc.fr
</Directory>

分析:
以上語句通過<Directory>標籤定義了一個文件系統容器,並使用Alias指令把該容器映射到/homepage的URL上去。通過這裏的設置,不會影響原來的DocumentRoot,或其它的已自定義的文件系統容器。
在該文件系統容器中還定義了一系列屬性。對上述配置的解釋如下:
* <Directory "D:/heavyz/homepage"> and </Directory> : 定義本地文件系統容器,該容器位於D:/heavyz/homepage中。
* Alias /homepage "D:/heavyz/homepage" : 當URL中的路徑名爲/homepage時,將映射到該文件系統容器中。
* Options Indexes FollowSymLinks -ExecCGI : 當搜索不到默認首頁時,允許列出目錄的內容;允許目錄中的符號鏈;不允許執行CGI腳本。
* DirectoryIndex index.php index.html home/index.php home/index.html : 按照列出的四個本地URL搜索默認首頁,最先找到的文件作爲首頁返回。(即若URL:http://localhost/homepage,則會先搜索默認首頁,若查不到相應的默認首面,則根據第二點配置,顯示homepage當前目錄的文件列表)
* Order allow,deny : Order規定了HTTP客戶的訪問權限。先允許再禁止(allow,deny)表明allow中允許的訪問權限優先級低於deny中禁止的訪問權限。
* Allow from all : 先允許來自任何地方的HTTP客戶的訪問請求。
* Deny from enpc.fr : 再禁止域名爲enpc.fr的HTTP客戶的訪問請求(國立路橋學校ENPC的主機不允許訪問該頁面),對於這些客戶,服務器返回403 Forbidden信息。注意Order中定義了deny的優先級高於allow,故該指令將生效。
假設在本地文件系統上存在文件D:\heavyz\homepage\index.html,重新啓動Apache服務器,並訪問頁面:http://localhost/homepage將可以訪問到上述文件(前提是你不在ENPC的網絡內)。
---------------------------------------------------------------------


(4)目前比較常用的負載均衡技術主要有:
1. 基於DNS的負載均衡
通過DNS服務中的隨機名字解析來實現負載均衡,在DNS服務器中,可以爲多個不同的地址配置同一個名字,而最終查詢這個名字的
客戶機將在解析這個名字時得到其中一個地址。因此,對於同一個名字,不同的客戶機會得到不同的地址,他們也就訪問不同地址
上的Web服務器,從而達到負載均衡的目的。
2. 反向代理負載均衡 (如Apache+JK2+Tomcat這種組合)
使用代理服務器可以將請求轉發給內部的Web服務器,讓代理服務器將請求均勻地轉發給多臺內部Web服務器之一上,從而達到負載
均衡的目的。這種代理方式與普通的代理方式有所不同,標準代理方式是客戶使用代理訪問多個外部Web服務器,而這種代理方式
是多個客戶使用它訪問內部Web服務器,因此也被稱爲反向代理模式。
3. 基於NAT(Network Address Translation)的負載均衡技術 (如Linux Virtual Server,簡稱LVS)網絡地址轉換爲在內部地址和外部地址之間進行轉換,以便具備內部地址的計算機能訪問外部網絡,而當外部網絡中的計算機訪問
地址轉換網關擁有的某一外部地址時,地址轉換網關能將其轉發到一個映射的內部地址上。因此如果地址轉換網關能將每個連接均勻轉換爲不同的內部服務器地址,此後外部網絡中的計算機就各自與自己轉換得到的地址上服務器進行通信,從而達到負載分擔的目的。


(5)Apache,Tomcat負載均衡和集羣:
1.對請求的處理又有兩種不同的方式:負載平衡、狀態複製(即集羣).
負載平衡:
每臺服務器都是獨立的,只是對請求的負載進行平衡,而不對狀態(SESSION)進行復制。
狀態複製(集羣):先進行負載平衡,再在各服務器間複製應用狀態。
2.apache負載均衡的原理:
1).mod_jk負載平衡原理:
使用mod_jk默認的以輪循方式進行平衡負載,假設有四個服務器節點,有10個請求,則
第一個節點會得到1,5,9請求;
第二個節點會得到2,6,10請求;
第三個節點會得到3,7請求;
第四個節點會得到4,8請求;
2).Mod_JK2負載均衡與故障復原:
Apache httpd是當成web服務器,使用mod_jk2將請求傳送給Tomcat,就可以使用mod_jk2的負載均衡與容錯功能。
帶有 mod_jk2的Apache(httpd)可以做的事情包括:
A、將請求分配至一或多個Tomcat實例上你可以在mod_jk2的workers.properties文件中,設定許多Tomcat實例,並賦於每個實例一個lb_factor值,以作爲請求分配的加權因子。
B、偵測Tomcat實例是否失敗當Tomcat實例的連接器服務不再響應時,mod_jk2會及時偵測到,並停止將請求送給它。其他的Tomcat 實例則會接受失效實例的負載。
C、偵測Tomcat實例在失效後的何時恢復因連接器服務失效,而停止將請求分配給Tomcat實例之後,mod_jk2會週期性地檢查是否已恢復使用性,並自動將其加入現行的Tomcat實例池中。

3).實踐證明,在各應用服務器之間不需要狀態複製的情況下,負載平衡可以達到性能的線性增長及更高的併發需求。


3 集羣原理:
集羣方式也是使用這種方法進行平衡。Tomcat中的集羣原理是通過組播的方式進行節點的查找並使用TCP連接進行會話的複製。
集羣與負載均衡的優缺點:
不足:
集羣不同於負載平衡的是,由於集羣服務需要在處理請求之間不斷地進行會話複製,複製後的會話將會慢慢變得龐大,因此它的資
源佔用率是非常高的,如果在併發量大的應用中,複製的會話大小會變得相當大,而使用的總內存更是會迅速升高。
優點:
但集羣的會話複製,增加了系統的高可用性。由於在每臺服務器都保存有用戶的Session信息,如果服務器羣中某臺當機,應用可以自動切換到其它服務器上繼續運行,而用戶的信息不會丟失,這提高了應用的冗錯性。
具體採用負載平衡還是集羣,這要看應用的需求了。


(6)Apache,Tomcat負載均衡和集羣配置:
0,環境說明
Apache :apache_2.0.55 1 個
Tomcat: apache-tomcat-5.5.17 (zip版) 2個
mod_jk:: mod_jk-apache-2.0.55.so 1個
第一部分:實現負載均衡
負載均衡,就是apache將客戶請求均衡的分給tomcat1,tomcat2....去處理
1.下載,安裝apche,tomcat
http://httpd.apache.org/ 下載Apache 2.0.55
http://tomcat.apache.org/download-55.cgi 下載tomcat5.5 zip版本(解壓即可,綠色版)
http://apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/ 下載mod_jk,注意和 apache版本匹配
本文附件中,以有apache_2.0.55+mod_jk-apache-2.0.55.so。可直接下載使用。
安裝apache:
此處注意,如果你本機已經裝了iis並且佔用80端口,務必先在服務中將iis停止或禁用。
軟件默認安裝即可。安裝過程中設置Network Domain和Server Name爲localhost,設置你的email(可任意設置)地址,下方會讓你選擇only for the current user或for all users。默認選擇for all users。這樣Apache就會佔用80端口,並且做爲一個系統服務開機自運行。
安裝完成之後,你在瀏覽器中輸入http://localhost,將會看到Apache的成功頁面.此時 Apache,已經運行,你可以在窗口的托盤看到他的圖標,雙擊圖標,在彈開的窗口選擇"Open Apache Monitor",點Stop,停止Apaceh服務,因爲下面要安裝Tomcat和JK.
JK的安裝:
把mod_jk_2.0.55.so拷貝到d:\Apache \Apache2\modules\下.(可以修改名稱爲mod_jk.so),還需在httpd.conf中加上關於mod_jk的配置。

LoadModule jk_module modules/mod_jk.so


以上安裝全部完成後,打開cmd命令提示符,運行d:\Apache\Apache2\bin\Apache.exe -t 你將會看到"Syntax OK",表示Apache配置正常.這個命令非常有用,下面在繼續配置Apache的時候還會再次用到。
2.修改Apache配置文件http.conf
在apache安裝目錄下conf目錄中找到http.conf
在文件最後加上下面一句話就可以了
include "E:\ide\apache\Apache2\conf\mod_jk.conf"

2. http.conf 同目錄下新建mod_jk.conf文件,內容如下(或直接將此內容寫到上面的文件中也可)
#加載mod_jk Module
LoadModule jk_module modules/mod_jk-apache-2.0.55.so
#指定 workers.properties文件路徑
JkWorkersFile conf/workers.properties
#指定那些請求交給tomcat處理,"controller"爲在workers.propertise裏指定的負載分配控制器
JkMount /*.jsp controller
也可以根據需要添加,如:
JkMount /servlet/* controller
JkMount /*.do controller
3. 在http.conf同目錄下新建 workers.properties文件,內容如下
worker.list = controller #server 列表,不加tomcat節點
#========tomcat1========
worker.tomcat1.port=8009 #ajp13 端口號,在tomcat下server.xml配置,默認8009
worker.tomcat1.host=localhost #tomcat的主機地址,如不爲本機,請填寫ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1 #server的加權比重,值越高,分得的請求越多

#worker.jboss1.cachesize=10
#worker.jboss1.cache_timeout=600
#worker.jboss1.socket_keepalive=1
#worker.jboss1.socket_timeout=300 
#========tomcat2========
worker.tomcat2.port=9009 #ajp13 端口號,在tomcat下server.xml配置,默認8009
worker.tomcat2.host=localhost #tomcat的主機地址,如不爲本機,請填寫ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1 #server的加權比重,值越高,分得的請求越多

#========controller, 負載均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分擔請求的tomcat
worker.controller.sticky_session=true
worker.porperties配置說明:
假設定義了兩個worker,一個爲server99,另一個爲server202,定義了一個負載平衡服務器loadbalancer。
A、worker.list=loadbalancer
設定工作的負載平衡器,各Tomcat節點不能加入此列表。
B、worker.server99.lbfactor
負載平衡的權重比,如果此權重比越大,則分配到此節點的請求越多,如以上兩個節點的權重比爲1:1,則爲平均分配。
C、worker.loadbalancer.balance_workers=server99,server202
指定此負載平衡器負責的Tomcat應用節點。
D、worker.loadbalancer.sticky_session=true
此處指定集羣是否需要會話複製,如果設爲true,則表明爲會話粘性,不進行會話複製,當某用戶的請求第一次分發到哪臺
Tomcat後,後繼的請求會一直分發到此Tomcat服務器上處理;如果設爲false,則表明需求會話複製。
4.修改tomcat配置文件server.xml
如果你在不同電腦上安裝tomcat,tomcat的安裝數量爲一個,可以不必修改tomcat配置文件.我這裏是在同一臺電腦上安裝兩個tomcat,所以需要更改其中一個的設置
打開 tomcat2/conf/server.xml文件
主要是關於端口號佔用的問題。


5. 編寫一個測試jsp
建立一個目錄test.裏面新建一個test.jsp,內容爲
<%
System.out.println("===========================");
%>
把test放到tomcat1,tomcat2的webapps下
6. 啓動apache,tomcat1,tomcat2,進行測試
通過 http://localhost/test/test.jsp 訪問,查看tomcat1的窗口,可以看到打印了一行"=========="
再刷新一次,tomcat2也打印了一條,再刷新,可以看到請求會被tomcat1,tomcat2輪流處理,實現了負載均衡

第二部分,配置集羣
只配置負載均衡還不行,還要session複製,也就是說其中任何一個tomcat的添加的session,是要同步複製到其它tomcat, 集羣內的tomcat都有相同的session
1. 修改tomcat1, tomcat2的server.xml,將集羣部分配置的在註釋符刪掉,並將tomcat2的4001端口改爲4002,以避免與 tomcat衝突,當然,如果是兩臺電腦,是不用改端口的,去掉註釋符即可 
 <Cluster ....>....</Cluster>標籤的註釋需要去掉
如果tomcat在同一臺機器上那麼還要修改對應的tcpListenPort屬性。取值範圍4001-4009,集羣的tomcat不能相同的值


2,修改測試項目test
修改test.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.print("<b>Session 列表</b>");
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="index.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>
然後在test 新建WEB-INF目錄,WEB-INF下新建web.xml,內容如下
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<display-name>TomcatDemo</display-name>
<distributable/>
</web-app>
注意:在你的應用的web.xml加入 <distributable/>即可
ok,講test複製到tomcat1,tomcat2的webapps下,重啓 apache,tomcat1,tomcat2,
輸入網址 http://localhost/test/test.jsp
新建一個 名稱爲 xiaoluo ,值爲 cdut 的session,提交查詢,新開一個ie窗口,再提交查詢,如圖,可以看到,兩個tomcat 是負載均衡,並且session同步的

需要注意的是,配置集羣時設置 jvmRoute時,要把原來的Engine註釋掉,去掉上面那一行的註釋,也就是修改成
<!-- You should set jvmRoute to support load-balancing via JK/JK2 ie : -->
<Engine name="Standalone" defaultHost="localhost" debug="0" jvmRoute="tomcat1" >
(3)
設置apache負載均衡器的log格式:
#加載mod_jk模塊
LoadModule jk_module modules/mod_jk-1.2.14-apache-2.0.54.so
# Where to find workers.properties
JkWorkersFile conf/workers2.properties
# Where to put jk logs
JkLogFile 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 KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"

 

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