結合Apache和Tomcat實現集群和負載均衡

2021-08-29 17:15:17 字數 4264 閱讀 4538

本文基本參考自 輕鬆實現apache,tomcat集群和負載均衡,經由實操經歷記錄而成,碰到些出入,以及個別地方依據個人的習慣,所以在一定程度上未能保持原文的完整性,還望原著者海涵。

一:軟體環境

二:負載均衡

用apache進行分流,把請求按照權重以及當時負荷分tomcat1,tomcat2...去處理

1. 安裝apache,tomcat

我把apache安裝在d:\apache group\apache2

解壓兩分tomcat, 分別在 d:\apache group\tomcat5_1,d:\apache group\tomcat5_2

如果把不同版本的tomcat進行集群,目錄就可用tomcat4_3(版本為4.x的第三個tomcat伺服器),tomcat6_4(版本為6.x的第三個tomcat伺服器),這是unmi本人的習慣。

2.修改apache配置檔案http.conf

在apache安裝目錄下conf目錄中找到http.conf,在檔案最後加上下面一句話就可以了

include conf\mod_jk.conf

3. 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

如果還要指定*.do也進行分流就再加一行

jkmount /*.do controller

如果你想對所有的請求進行分流只需要寫成

jkmount /* controller

4. 在http.conf同目錄下新建 workers.properties檔案,內容如下(可能要去除 # 不在行首的注釋)

worker.list = controller,tomcat1,tomcat2 #server 列表 #*****===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的加權比重,值越高,分得的請求越多 #*****===tomcat2*****=== worker.tomcat2.port=8109 #ajp13 埠號,在tomcat下server.xml配置,預設8009 worker.tomcat2.host=localhost #tomcat的主機位址,如不為本機,請填寫ip位址 worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor = 2 #server的加權比重,值越高,分得的請求越多 #*****===controller,負載均衡控制器*****=== worker.controller.type=lb worker.controller.balanced_workers=tomcat1,tomcat2 #指定分擔請求的tomcat worker.controller.sticky_session=1

5. 修改tomcat配置檔案server.xml

改為8105" shutdown="shutdown">

2) 把http服務埠號由8080改為8180

找到8080"

把這裡的8080改為8180

3) 把ajp埠號由8009改為8109

找到8009"

把這裡的8009改為8109

4) 把 http **埠從8082改為8182(這個配置預設是被注釋掉的,可跳過這一步)

找到8082"

把這裡的8082改為8182

5) 編寫乙個測試 jsp

建立乙個目錄testcluster,裡面新建乙個test.jsp,內容為

<% system.out.println("*************************=="); %>

6) 啟動apache,tomcat1,tomcat2,進行測試

通過 http://localhost/testcluster/test.jsp 訪問,多重新整理幾次頁面,檢視tomcat1和tomcat2的視窗,你將可以看到列印了一行 行"*************************==",並且從統計上來說,大約在tomcat2列印的數量是在tomcat1中的兩倍,可以看 到請求會被tomcat1,tomcat2按照不同的權重分流處理,實現了負載均衡。

作下面的集群配置,請在workers.properties把tomcat1和tomcat2的權重改為一樣的,使請求較平均分配,將有便於看到實驗的效果。

三:配置集群

只配置負載均衡還不行,還要session複製,也就是說其中任何乙個tomcat的新增的session,是要同步複製到其它tomcat, 集群內的tomcat都有相同的session

1. 修改tomcat1, tomcat2的server.xml,將集群部分配置,即對節點的在注釋符刪掉,並將tomcat2的4001埠改為4002,以避免與tomcat衝突,當然,如果是兩台電腦,是不用改埠的,去掉注釋符即可

即取消對如下處

前後的注釋標記,啟用該項配置,實現伺服器間的session複製。

2. 為 tomcat1和 tomcat2 增加 jvmroute(

先跳過這一步,有精力可以試驗一下)

在 tomcat1 和 tomcat2 的 server.xml 檔案,找到

分別改為

jvmroute="tomcat1">

和jvmroute="tomcat2">

然而實際我配置的時候還不能加jvmroute屬性,配置了反而有問題。

重新整理瀏覽器視窗總是在某乙個tomcat控制台輸出形如

sessionid:154678fa6d4d0abd57658b750e7a3532.tomcat1 (在tomcat1視窗)

或者sessionid:3800571a532aecea7280f45361861ad4.tomcat2 (在tomcat2視窗)

由控制台列印的結果可以看出,sessionid在哪個tomcat上產生,那麼後續該會話的請求將總是會這個tomcat來處理。

並且注意到sessionid的形式比通常情況多了乙個字尾.tomcat1或.tomcat2,還搞不清楚是為什麼。

配置時請視實際情況而取捨。

3. 修改測試專案 testcluster

修改test.jsp,內容如下

<% system.out.println("sessionid:" + session.getid()); %> server info: <% out.println(request.getservername() + " : " + request.getserverport()+"

");%> <% out.println("

id " + session.getid()+"

"); // 如果有新的 session 屬性設定 string dataname = request.getparameter("dataname"); if (dataname != null && dataname.length() > 0) out.print("session 列表

"); enumeration e = session.getattributenames(); while (e.hasmoreelements()) %>

4. 配置session複製

在testcluster目錄下新建web-inf目錄,web-inf下新建web.xml,內容如下

通過 http://localhost/testcluster/test.jsp 訪問,輸入名稱為 name, 值為 unmi,提交查詢,多重新整理幾次瀏覽器視窗,你將會看到在兩個tomcat視窗都列印出相同的sessionid及其中的值,並且每次重新整理後列印的結果都一樣的。

如果不為應用的web.xml加上 ,同樣測試上面那個test.jsp頁面,每次重新整理分流到不同的tomcat上都會產生不一樣的sessionid,在同乙個tomcat上也是間隔出現不同的sessionid。

更切身的體驗是一定要自己動手配置一遍,並仔細觀察兩個tomcat的控制上的輸出。因本文是參考 輕鬆實現apache,tomcat集群和負載均衡 的實踐經歷,該本中有較多的貼圖。

結合Apache和Tomcat實現集群和負載均衡

一 軟體環境 二 負載均衡 用apache進行分流,把請求按照權重以及當時負荷分tomcat1,tomcat2.去處理 1.安裝apache,tomcat 我把apache安裝在d apache group apache2 解壓兩分tomcat,分別在 d apache group tomcat5 ...

Apache和PHP結合 Apache預設虛擬主機

apache和php結合 1 先禁用之前的php7的模組 2 檢視下是否禁用php7模組 root centos7 usr local apache2.4 bin apachectl m rewrite module shared php5 module shared 只有乙個,說明禁用了 synt...

Karrigell和apache的結合

原文 因為python並不是特別為web開發而生,所以現在很多的python使用者都在開發能夠讓python執行於web的框架.karrigell就是現在為數眾多的python web框架之一.本文將對karrigell做簡要的介紹.簡介 karrigell是乙個功能強大且靈活的python web...