天天看點

如何編譯Apache的JK子產品基于AJP協定連接配接Tomcat,實作負載均衡。

        nginx,Apache,HAProxy都可以通過http協定将請求代理至後端的tomcat,但是隻有Apache可以支援更高效的AJP協定連接配接tomcat,接下來我們來看看如何實作吧。

實驗環境:RHEL6.4

admin1.tuchao.com  192.168.18.201 //tomcat伺服器

admin2.tuchao.com  192.168.18.202 //tomcat伺服器

admin3.tuchao.com  192.168.18.203 //Apache伺服器

jk子產品源碼包下載下傳位址:http://tomcat.apache.org/download-connectors.cgi

jk子產品文檔位址:http://tomcat.apache.org/connectors-doc-archive/jk2/jk/aphowto.html

安裝tomcat(略)  配置serve.xml在Engine标簽加入一個jvmRoute然後啟動tomcat。

<a href="http://s3.51cto.com/wyfs02/M00/45/B8/wKioL1PqC2yyn65tAAHR1zArPl0586.jpg" target="_blank"></a>

由于在編譯jk子產品的時候要指定apxs程式的位置,如果沒有這個程式,則安裝httpd-devel,apr-devel,apr-util-devel。

yum install httpd-devel apr-devel apr-util-devel -y

檢視apxs具體位置。

rpm -ql httpd-devel

<a href="http://s3.51cto.com/wyfs02/M02/45/B8/wKioL1PqBoyBJIOVAAFModXKRys210.jpg" target="_blank"></a>

解壓源碼包,開始編譯。

tar xf tomcat-connectors-1.2.37-src.tar.gz

cd tomcat-connectors-1.2.37-src/native/

./configure--with-apxs=/usr/sbin/apxs

make &amp;&amp; make install

安裝完成

<a href="http://s3.51cto.com/wyfs02/M00/45/B8/wKioL1PqBsnTuJfjAAK-RzsR8l0511.jpg" target="_blank"></a>

配置啟用此子產品,定義一個配置檔案來儲存子產品相關指令

vim /etc/httpd/conf.d/mod_jk.conf

在檔案中輸入以下内容:

LoadModule  jk_module /usr/lib/httpd/modules/mod_jk.so //裝載jk子產品

JkWorkersFile  /etc/httpd/conf.d/workers.properties  //定義工作屬性的配置檔案

JkLogFile  logs/mod_jk.log  //日志檔案

JkLogLevel  debug //日志級别

JkMount  /* TomcatA  //将哪個路徑轉發至哪個work執行個體,執行個體名稱要基于後端tomcat jvmRoute配置。

JkMount  /status/ stat1

建立jk子產品工作屬性的配置檔案。

vim /etc/httpd/conf.d/workers.properties

worker.list=TomcatA,stat1  //定義work執行個體清單

worker.TomcatA.port=8009  //指定tomcatA所監聽的端口,這裡worker執行個體的名稱要基于後端tomcat伺服器,server.xml 配置檔案 Engine标簽中jvmRoute指令的定義。

worker.TomcatA.host= 192.168.18.201  //主機位址

worker.TomcatA.type=ajp13  //指定協定

worker.TomcatA.lbfactor=1  //權重

worker.stat1.type= status  //配置輸出狀态接口

配置完成後儲存,啟動httpd。

work常見的工作類型:

ajp13::使用ajp13協定連接配接tomcat

lb:使用負載均衡

status:用于顯示環境中各實際worker工作狀态。

worker其它常見的屬性說明:

host:Tomcat 7的worker執行個體所在的主機;

port:Tomcat 7執行個體上AJP1.3連接配接器的端口;

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

connection_pool_timeout:連接配接池中連接配接的逾時時長;

mount:可以定義請求的路徑轉發至某個執行個體,如果有多個則使用空格格開;此屬性可以由JkMount指令替代;

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

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

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

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

現在我們嘗試通路Apache伺服器的位址。

<a href="http://s3.51cto.com/wyfs02/M02/45/B8/wKioL1PqDb_B79B2AAN8Qa5zbvM628.jpg" target="_blank"></a>

配置進階—實作負載均衡。

admin1主機:

配置Engine

&lt;Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA" &gt;

添加虛拟主機

<a href="http://s3.51cto.com/wyfs02/M01/45/B9/wKioL1PqFB6TMfMxAAGOtRyVezw647.jpg" target="_blank"></a>

建立測試頁面 vim /usr/local/tomcat/webapps/luntan/index.jsp

複制以下代碼:

&lt;%@ page language="java" %&gt;

&lt;html&gt;

  &lt;head&gt;&lt;title&gt;TomcatA&lt;/title&gt;&lt;/head&gt;

  &lt;body&gt;

    &lt;h1&gt;&lt;font color="red"&gt;TomcatA &lt;/font&gt;&lt;/h1&gt;

    &lt;table align="centre" border="1"&gt;

      &lt;tr&gt;

        &lt;td&gt;Session ID&lt;/td&gt;

    &lt;% session.setAttribute("abc","abc"); %&gt;

        &lt;td&gt;&lt;%= session.getId() %&gt;&lt;/td&gt;

      &lt;/tr&gt;

        &lt;td&gt;Created on&lt;/td&gt;

        &lt;td&gt;&lt;%= session.getCreationTime() %&gt;&lt;/td&gt;

     &lt;/tr&gt;

    &lt;/table&gt;

  &lt;/body&gt;

&lt;/html&gt;

測試頁面

<a href="http://s3.51cto.com/wyfs02/M01/45/B8/wKiom1PqFN3TNYMMAAD2XaaaZiE432.jpg" target="_blank"></a>

admin2主機:

 &lt;Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatB" &gt;

<a href="http://s3.51cto.com/wyfs02/M01/45/B9/wKioL1PqF3nDHeYsAACcQQ1KnG8248.jpg" target="_blank"></a>

建立測試頁面 vim /web/index.jsp

  &lt;head&gt;&lt;title&gt;TomcatB&lt;/title&gt;&lt;/head&gt;

    &lt;h1&gt;&lt;font color="blue"&gt;TomcatB &lt;/font&gt;&lt;/h1&gt;

<a href="http://s3.51cto.com/wyfs02/M00/45/BA/wKioL1PqGCHx2-CtAADmL-GReio038.jpg" target="_blank"></a>

admin3主機:

編輯Apache jk子產品配置檔案 vim /etc/httpd/conf.d/mod_jk.conf

LoadModule  jk_module  /usr/lib/httpd/modules/mod_jk.so

JkWorkersFile  /etc/httpd/conf.d/workers.properties

JkLogFile  logs/mod_jk.log

JkLogLevel  debug

JkMount  /*  lbcluster1  //将哪個路徑轉發至哪個work執行個體

JkMount  /status/  stat1

編輯jk子產品工作屬性配置檔案 vim /etc/httpd/conf.d/workers.properties

worker.list = lbcluster1,stat1  //定義work執行個體

worker.TomcatA.type = ajp13  

worker.TomcatA.host = 192.168.18.201  

worker.TomcatA.port = 8009  //這裡定義的端口要和tomcat AJP協定監聽的端口一緻。

worker.TomcatA.lbfactor = 1

worker.TomcatB.type = ajp13

worker.TomcatB.host = 192.168.18.202

worker.TomcatB.port = 8009

worker.TomcatB.lbfactor = 1  //定義權重

worker.lbcluster1.type = lb  //定義工作類型

worker.lbcluster1.sticky_session = 1  //啟用會話保持

worker.lbcluster1.balance_workers = TomcatA, TomcatB  //定義後端執行個體,這裡worker執行個體的名稱要基于後端tomcat伺服器,server.xml 配置檔案 Engine标簽中jvmRoute指令的定義。注意在這裡執行個體名第一個字母要大寫,不然會出錯。

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

worker.stat1.type = status

配置完成後儲存,重新開機httpd服務。

修改本機的hosts檔案,www.tuchao.com  192.168.18.203 

通路www.tuchao.com

<a href="http://s3.51cto.com/wyfs02/M01/45/BB/wKioL1PqIXzj8XnjAAEYkkQ9DWQ966.jpg" target="_blank"></a>

重新整理,由于這裡啟用了會話保持的功能,要多刷幾次才會切換。

<a href="http://s3.51cto.com/wyfs02/M00/45/BA/wKiom1PqIOfRgeS9AAECi6tlWpQ984.jpg" target="_blank"></a>

實驗完成,我admin1主機tomcat http協定監聽的端口是8080,而admin2主機tomcat  http協定監聽的端口我改成了80,在負載均衡轉發的時候卻毫不受影響,應該是因為Apache是通過AJP協定8009端口與tomcat通信的,是以tomcat服務http協定監聽在哪個端口無所謂。 

哈哈,不知道這樣了解是不是對了。

本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1539166