Apache + Tomcat +mod_jk實現集群服務


Tomcat中的集群原理是通過組播的方式進行節點的查找並使用TCP連接進行會話的復制。

實現效果:apache 分發請求到tomcat中的對應的項目 

環境說明:

操作系統window xp

Javasdk: 1.7
Apache: 2.2.14    (本地安裝路徑:D:\Apache2.2\)
Tomcat: 7.0.42 http://tomcat.apache.org/download-70.cgi ),如果在同一台機器上模擬,下載zip版本實例中展示了2個節點
mod_jk: 1.2.37: http://tomcat.apache.org/download-connectors.cgi )

 

安裝步驟:

1.安裝jdk
2.安裝Apache2.2,使用默認設置,並且安裝路徑中不要空格.
3.解壓tomcat
4.拷貝mod_jk.soApache安裝路徑的modules文件夾下


配置步驟

修改Apache配置:

關於修改涉及到的文件httpd.confworkers.properties文件可以下載一份mod_jk的源碼包參看

1.修改Apache配置文件httpd.conf(筆者路徑:D:\Apache2.2\conf\httpd.conf), 在最后一行末尾添加:

include "D:\Apache2.2\conf\mod_jk.conf"

2. 在httpd.conf 同目錄下新建mod_jk.conf文件

#加載mod_jk Module 
LoadModule jk_module modules/mod_jk.so

#指定 workers.properties文件路徑
JkWorkersFile conf/workers.properties

#指定哪些請求交給tomcat處理,"controller"為在workers.propertise里指定的負載分配控制器名
JkMount /* controller

3.在httpd.conf同目錄下新建 workers.properties文件

#這里可以配置任意多個Tomcat,此處配置了2個Tomat服務器.
#host和port根據自己實際配置.實例配置的是本機兩個tomcat,分別使用不同的端口.避免沖突
#如果Tomcat不再同一機器上,沒必要改端口的。


#server 列表
worker.list=controller,tomcat1,tomcat2  


#========tomcat1========

worker.tomcat1.port=9988        #ajp13 端口號,在tomcat下server.xml配置,默認8009
worker.tomcat1.host=localhost        #tomcat的主機地址,如不為本機,請填寫ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1        #server的加權比重,值越高,分得的請求越多

#========tomcat2========

worker.tomcat2.port=9999        #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


#指定此負載平衡器負責的Tomcat應用節點。

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

#此處指定集群是否需要會話復制,如果設為true,則表明為會話粘性,不進行會話復制,當某用戶的請求第一次分發到哪台
#Tomcat后,后繼的請求會一直分發到此Tomcat服務器上處理;如果設為false,則表明需求會話復制。

worker.controller.sticky_session=false      #設為false,則表明需求會話復制。

 

修改Tomcat配置:
說明,如果修改了tomcat配置文件,最好將文件編碼轉換成utf-8格式.
因為實例中我們定義了2tomcat處理分發.所以我們將tomcat的解壓版本(zip)格式復制一份.用來分別擔當不同的分發處理角色這里因為在一台機器上,所以我們使用zip版本的,當然你某個分發處理機器上只一個tomcat服務器的話,可以選擇安裝版本的.這里推薦使用解壓版的.tomcat6的配置方式跟7一致.

tomcat-node1為實例

1.修改分發tomcat對應的service.xml文件,保證Apache對應的 workers.properties中的AJP13connectorport. 

    <!-- 定義一個AJP 1.3 連接端口為9988 ,默認值為8009,這里我們改成我們自己定義的9988端口 -->
    <Connector port="9988" protocol="AJP/1.3" redirectPort="8443" />

 

2.增加jvmRoute的值,保證同workers.properties里邊配置的值一致

    <!--增加jvmRoute,值為在Apache中配置的list集群結點中的值,這里定義為tomcat1結點-->
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

 

3.去掉默認注釋掉的集群配置

    <!--取消集群結點相關的注釋,該句默認值注釋掉的,我們需要配置集群所以去掉注釋,讓其起作用-->
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

如果我們的tomcat結點分布在不同的機器上,那么我們的集群至此已經配置完成.去掉多余注釋,顯示做了修改的部位

修改前

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> -->
    <Engine name="Catalina" defaultHost="localhost">

    <!--For clustering-->
    <!-- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> -->

修改后的tomcat-node1

    <!-- 定義一個AJP 1.3 連接端口為9988 ,默認值為8009,這里我們改成我們自己定義的9988端口 -->
    <Connector port="9988" protocol="AJP/1.3" redirectPort="8443" />

    <!--增加jvmRoute,值為在Apache中配置的list集群結點中的值,這里定義為tomcat1結點-->
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

    <!--取消集群結點相關的注釋,該句默認值注釋掉的,我們需要配置集群所以去掉注釋,讓其起作用-->
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

修改后的tomcat-node2

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="9999" protocol="AJP/1.3" redirectPort="8443" />

    <!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> -->
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

    <!--For clustering-->
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

說明:這里的protocol="AJP/1.3",連接以及jvmRoute需要保證同我們在Apache服務器中配置的works.properties一致.修改完后最好將service.xml文件的編碼設置為utf-8格式.否則可能tomcat啟動會出錯.

 

4.實例中我們的兩個tomcat結點在同一台機器上,所以還需要保證protocol="HTTP/1.1"的端口不一致.不然本地的兩個tomcat會起沖突

下面為筆者實例中解決同一台機器上多個tomcat服務器之間端口沖突做的修改.

Tomcat--node1

Tomcat-node2

<Server port="9995" shutdown="SHUTDOWN"> …… <Connector port="9990" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> ……

說明:這里的protocol="HTTP/1.1"配置的相關端口之間不能沖突,而且也不能同本機其它應用程序占用的端口沖突.否則可能會報錯.

實例測試

1.在web.xml文件中增加

<distributable/>

2.編寫測試jsp代碼

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.text.SimpleDateFormat"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Tomcat集群測試</title>
  </head>
  
  <body> 服務器信息: <% String dtm = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()); System.out.println("["+request.getLocalAddr()+":"+ request.getLocalPort()+"]" + dtm); out.println("<br>["+request.getLocalAddr()+":" +request.getLocalPort()+"]" + dtm+"<br>"); %> session分發: <% session.setAttribute("name","dennisit"); System.out.println("[session分發] session id:"+session.getId()); out.println("<br>[session分發] session id: " + session.getId()+"<br>"); %> </body>
</html>

3.測試負載均衡與session分發

將項目部署到每個集群結點中,即實例中的tomcat_node1tomcat_node2,依次移動Apachetomcat服務器,tomcat服務器之間的啟動順序隨意.這里Apache端口使用默認的80.






上面是在FireFox中運行項目后刷新3次執行的效果,可以看到2tomcat分發結點之間輪流負載.而且兩台服務器上的session值是一樣的.說明session分發成功.

兩台Tomcat服務器日志打印輸出結果:


錯誤解決
問題:發生服務特定錯誤:1

右鍵我的電腦->管理->系統工具->時間查看器->應用程序,然后對應應用程序的右側可以查看到錯誤日志.

筆者錯誤:

 

The Apache service named  reported the following error:
>>> httpd.exe: Syntax error on line 484 of D:/Apache2.2/conf/httpd.conf: Syntax error on line 1 of D:/Apache2.2/conf/mod_jk.conf: Cannot load D:/Apache2.2/modules/mod_jk.so into server: \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xb3\xcc\xd0\xf2\xa1\xa3     .

 

錯誤原因,這個文件要跟Apache版本對應.我的Apache版本為2.2,最初搞的為 tomcat-connectors-1.2.37-windows-i386-httpd-2.0.x本所以錯誤.

修復后啟動


附錄:

ApacheTomcat的區別:
Apache是一個web服務器環境程序,可以作為web服務器使用。不過只支持靜態網頁,如(asp,php,cgi,jsp)等動態網頁的就顯得無能為力。
如果想讓服務器也能處理動態頁面,那么就需要Tomcat

當處理靜態頁面時,Tomcat不如Apache迅速。Tomcat不象Apache一樣可配置(如:可以作為一個代理服務器,即loadbalaner)

Tomcat不象Apache一樣強壯。

基於以上原因,一個現實的網站使用一個Apache作為Web服務器,為網站的靜態頁面請求提供服務;並使用Tomcat服務器作為一個Servlet/JSP插件,顯示網站的動態頁面。

 

Apache,Tomcat負載均衡和集群

對請求的處理又有兩種不同的方式:負載平衡、狀態復制(即集群).
負載平衡:每台服務器都是獨立的,只是對請求的負載進行平衡,而不對狀態(SESSION)進行復制。
狀態復制(集群):先進行負載平衡,再在各服務器間復制應用狀態。

 

Apache+Tomcat構建企業級應用

1.Apache主要用來解析靜態文本,htmltomcat也有此功能,但apache能大大提高效率,對於並發數較大的企業級應用,能更好的顯示Apache的高效率;  
2.Tomcat 用來解析jsp,servlet,所有的客戶請求首先會發送到apache,如果請求是靜態文本則由apache解析,並把結果返回給 客戶端,如果是動態的請求,如jspapache會把解析工作交給tomcat,由tomcat進行解析(這首先要兩者現實整合),tomcat解析完 成后,結果仍是通過apache返回給客戶端,這樣就可以達到分工合作,實現負載均衡,提高系統的性能!


轉載請注明出處:[http://www.cnblogs.com/dennisit/p/3370220.html]


ÔÚÏß½»Ì¸


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM