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 && 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
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA" >
添加虛拟主機
<a href="http://s3.51cto.com/wyfs02/M01/45/B9/wKioL1PqFB6TMfMxAAGOtRyVezw647.jpg" target="_blank"></a>
建立測試頁面 vim /usr/local/tomcat/webapps/luntan/index.jsp
複制以下代碼:
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA </font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("abc","abc"); %>
<td><%= session.getId() %></td>
</tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
測試頁面
<a href="http://s3.51cto.com/wyfs02/M01/45/B8/wKiom1PqFN3TNYMMAAD2XaaaZiE432.jpg" target="_blank"></a>
admin2主機:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatB" >
<a href="http://s3.51cto.com/wyfs02/M01/45/B9/wKioL1PqF3nDHeYsAACcQQ1KnG8248.jpg" target="_blank"></a>
建立測試頁面 vim /web/index.jsp
<head><title>TomcatB</title></head>
<h1><font color="blue">TomcatB </font></h1>
<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