1. 程式人生 > >Apache+Tomcat+jk叢集

Apache+Tomcat+jk叢集

Apache+Tomcat+jk叢集

原理:JK外掛的負載均衡器根據在worker.properties中配置的lbfactor(負載平衡因數),負責為集群系統中的Tomcat伺服器分配工作負荷,以實現負載平衡。每個Tomcat伺服器間用叢集管理器(SimpleTcpCluster)進行通訊,以實現HTTP回話的複製,比如Session。

一、搭建環境

作業系統:CentOS7

Jdk:1.7

Apache:2.4.33

Tomcat:7.0

Jk:1.2.43

二、安裝包準備

Cenos映象檔案

jdk-7u80-linux-x64.tar.gz(jdk)

httpd-2.4.33.tar.gz (

Apache)

apache-tomcat-7.0.88.tar.gz(Tomcat)

tomcat-connectors-1.2.43-src.tar.gz(Jk)

安裝Apache所需要的依賴包:

apr-1.6.3.tar.gz

apr-util-1.6.1.tar.gz

apr-iconv-1.2.2.tar.gz

pcre-8.39.tar.gz

三、叢集部署步驟

3.1安裝在VMware安裝centos7

https://blog.csdn.net/hui_2016/article/details/68927487

3.2 安裝配置jdk

1、將centos自帶jdk刪除

2、將jdk壓縮包拷貝到/urs/local下面

3、解壓:#tar -zxvf jdk-7u80-linux-x64.tar.gz

4、配置Java環境變數在/etc/profile 末尾

5、selinux=enforcing改為selinux=disabled /etc/selinux/config檔案中

3.3安裝Apache步驟

3.3.1安裝依賴包

1、下圖四個安裝包拷貝到/urs/local下面

 

2、安裝apr——執行以下程式碼

# tar -zxvf apr-1.6.3.tar.gz 

# cd apr-1.6.3

# ./configure --prefix=/usr/local/apr

 

# make

# make install

3、安裝apr-util——執行以下程式碼

注意:apr-util  1.6.0以上的版本需要 expat 的支援,下載安裝expat步驟如下: 

# wget https://sourceforge.net/projects/expat/files/expat/2.2.3/expat-2.2.3.tar.bz2

#tar -xjvf expat-2.2.3.tar.bz2

#./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-expat=/usr/local/expat

# make && make install

以上是apr-util 1.6.0所需要的步驟不然會報錯,接下來是apr-util安裝

# tar -zxvf  apr-util-1.6.1.tar.gz

# cd apr-util-1.6.1

#  ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-expat=/usr/local/expat

# make

# make install

4、安裝pcre——執行以下程式碼

  # tar -zxvf pcre-8.32.tar.gz

  # cd pcre-8.39

  # ./configure --prefix=/usr/local/pcre

  # make

  # make install

3.3.2安裝Apache

1、httpd-2.4.33.tar.gz拷貝到/urs/local下

2、#cd /usr/local

3、 #tar -zxvf httpd-2.4.33.tar.gz

4、#cd httpd-2.4.33

5、./configure --prefix=/usr/local/apache --enable-so -enable-proxy -enable-proxy_http=shared --enable-module=so --enable-mods-shared=all --enable-proxy-ajp=shared  --enable-proxy-balancer -with-mpm=worker  --with-apr=/usr/local/apr/ --with-apr-util=/usr/local/apr-util/ --with-pcre=/usr/local/pcre

[注意空格]

6、#make && make install

3.3.3 Apache 的配置及測試

1、# vim /apache/conf /httpd.conf

2、在檔案中開啟註釋ServerName,將ServerName值改為對應的IP地址,如下圖所示

 

3、檔案中的DirectoryIndex中新增 index.jsp,如下圖所示

 

4、檔案中以下2個註釋去掉:

 #Include conf/extra/httpd-mpm.conf

 #Include conf/extra/httpd-default.conf

5、儲存修改退出

6、# cd /urs/local/apache/bin

7、#./apachectl start

8、檢視程序服務:# ps -ef | grep httpd  顯示如下結果則說明已經情動服務

 

9、開啟瀏覽器訪問 輸入地址:http://127.0.0.1  如下介面,說明Apache安裝成功

 

3.4安裝Tomcat步驟

1、apache-tomcat-7.0.88.tar.gz拷貝到/urs/local 下面,解壓

#tar -zxvf apache-tomcat-7.0.88.tar.gz

2、將解壓後的資料夾重新命名為tomcat1,複製一份為tomcat2,方便區分,可利用xftp遠端連線工具進行該步驟

3、Server.xml具體修改3.6節會詳細講解

3.5安裝jk

1、將安裝包tomcat-connectors-1.2.43-src.tar.gz(Jk)目錄拷貝到

/usr/local目錄

2、#cd /usr/local

3、# tar -zxvf tomcat-connectors-1.2.43-src.tar.gz

4、編譯安裝mod_jk。

     #cd /tomcat-connectors-1. 2.43-src/native

     # chmod 755buildconf.sh

     # ./buildconf.sh

     # ./configure --with-apxs=/usr/local/apache/bin/apxs

     # make

     # make install

5、/tomcat-connectors-1.2.53/apache-2.0下的mod_jk.so檔案拷貝到apache安裝目錄下的modules資料夾下面。

3.6整合Apache+Tomcat+jk

3.6.1修改Tomcat 的server.xml

1、# cd /usr/local/tomcat1/conf

2、# vim server.xml

3、修改<Engine>的配置,開啟<Cluster>標籤,儲存退出

 

4、#vim /usr/local/tomcat2/conf/server.xml 【修改tomcat2的server.xml】

5、修改對應的埠號,以防埠產生衝突

①預設8005

 

②預設8080

 

預設8009

 

6、修改<Engine>的配置,開啟<Cluster>標籤,儲存退出

 

3.6.2 Apache配置——修改 httpd.conf

1、# vim/urs/local/apache/conf/httpd.xml

2、在檔案最後新增一下內容:

LoadModule jk_module modules/mod_jk.so

JkWorkersFile conf/workers.properties

#日誌檔案

JkLogFile logs/mod_jk.log

#tomcat執行模式

JkLogLevel debug

#收到.jsp結尾的檔案交給負載均衡器處理,可自行配置

JkMount /*.jsp loadbalancer

3.6.3 Apache配置——建立workers.properties

1、# touch /urs/local/apache/conf/workers.properties

2、#  vim workers.properties

3workers.properties具體配置如下:

# workers 列表

worker.list=tomcat1,tomcat2, loadbalancer, status

# 第一個tomcat1

worker.tomcat1.port=8009   #對應tomcat的server.xml中配置的ajp13埠號

worker.tomcat1.host=127.0.0.1  #tomcat1的主機IP地址,如不為本機,請填寫IP地址

worker.tomcat1.type=ajp13  #定向包協議

worker.tomcat1.lbfactor=1  #server的負載分配權重,值越高,分得的請求越多

#以下為非必要配置,這部分配置tomcat2的配置同tomcat1

#worker.tomcat1.cachesize=1000  #配置tomcat的jk連線快取大小 (非必要)

#worker.tomcat1.cachesize_timeout=600  # (非必要)

#worker.tomcat1.reclycle_timeout=300  # (非必要)

#worker.tomcat1.socket_keepalive=1  #防止防火牆切斷未啟用的網路連線(非必要)

#worker.tomcat1.socket_timeout=300   #(非必要)

#worker.tomcat1.local_worker=1  # (非必要)

#worker.tomcat1.retries=3  # (非必要) 

# tomcat2

worker.tomcat2.port=9009

worker.tomcat2.host=172.**.***.202  #tomcat2的主機IP地址

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor=1

# load balancerworker -負載均衡控制器

worker.loadbalancer.type=lb

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

worker.loadbalancer.sticky_session=1    #設定為粘性session

worker.loadbalancer.sticky_session_force=0  #設定當多次請求未響應,請求將轉發

worker.status.type=status

注意:

 

與servel.xml 中的jvmRoute一致

3.6.4 Web專案建立

1、新建web專案

2、index測試程式碼

<%@ 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.println("<b>Session 列表</b><br>");

  System.out.println("============================");

  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);

%>

  <forma"method="POST"> 

    名稱:<input type=textsize=20 name="dataName"> 

     <br> 

    :<inpu ttype=textsize=20 name="dataValue">

     <br>

   </form>

</body>

</html>

3、修改web.xml 檔案

<web-app>標籤裡新增<distributable/>,確保session能夠複製

4、將專案打成war包,放到tomcat1和tomcat2的webapps下面

四、測試

1、將Apache和Tomcat依次啟動

2、訪問http://127.0.0.1/專案名/index.jsp

測試結果:

Worker.properties中  .sticky_session=1 設定為有粘性,一個使用者在一個Tomcat中建立了會話後則此後這個使用者的所有操做都由這個Tomcat伺服器承擔,所以訪問一直出現的是tomcat1tomcat1關閉時,會由tomcat2承擔,但是sessionID不改變。

ID C3253704969A27AE48AD5EFDE4285708.tomcat1

ID C3253704969A27AE48AD5EFDE4285708.tomcat2

參考:

https://jingyan.baidu.com/article/ab0b5630b632dbc15afa7dc4.html

https://blog.csdn.net/h12kjgj/article/details/73421570

https://blog.csdn.net/guoyf123321/article/details/50724746【web專案參考】

五、知識點延伸

workers.properties配置 詳解  

 1、worker常見屬性

 ajp13:此型別表示當前worker為一個執行著的Tomcat例項。

  Lb lb即load balancing,專用於負載均衡場景中的woker;此worker並不真正負責處理使用者請求,而是將使用者請求排程給其它型別為ajp13的worker。

  Status :使用者顯示分散式環境中各實際worker工作狀態的特殊worker,它不處理任何請求,也不關聯到任何實際工作的worker例項。具體示例如請參見後文中的配置。       

     Host Tomcat 7的worker例項所在的主機

   Port Tomcat 7例項上AJP1.3聯結器的埠

   connection_pool_minsize :最少要儲存在連線池中的連線的個數;預設為pool_size/2

   connection_pool_timeout:連線池中連線的超時時長

   Mount :由當前worker提供的context路徑,如果有多個則使用空格格開;此屬性可以由JkMount指令替代

   retries :錯誤發生時的重試次數

   socket_timeout :mod_jk等待worker響應的時長,預設為0,即無限等待

   socket_keepalive :是否啟用keep alive的功能,1表示啟用,0表示禁用

   Lbfactor worker的權重,可以在負載均衡的應用場景中為worker定義此屬性     

   method :可以設定為R、T或B;預設為R,即根據請求的個數進行排程;T表示根據已經發送給worker的實際流量大小進行排程;B表示根據實際負載情況進行排程。

  sticky_session :在將某請求排程至某worker後,源於此址的所有後續請求都將直接排程至此worker,實現將使用者session與某worker繫結。預設為值為1,即啟用此功能。如果後端的各worker之間支援session複製,則可以將此屬性值設為0。

https://www.cnblogs.com/wala-wo/p/5119225.html【引數詳細講解】

 

文章可能存在不足的地方,僅供參考。