一、Apache反向代理介紹
Apache可以通過mod_jk和mod_proxy子產品跟Tomcat整合,mod_proxy隻能在apache 2.2.x系列的版本才能直接提供,它可以提供更豐富的功能和安全性;而對于apache1.3.x和2.0.x來說mod_jk才更合适,這倆種方式都可以使用tomcat内置的ajp和http類型的連接配接器來實作apache代理tomcat叢集。
二、實驗的環境:
192.168.30.116 OS:Centos6.4 x86_64 apache.luojianlong.com
192.168.30.117 OS:Centos6.4 x86_64 TomcatA.luojianlong.com
192.168.30.119 OS:Centos6.4 x86_64 TomcatB.luojianlong.com
Apache versrion: httpd-2.4.6
Tomcat version: apache-tomcat-7.0.53
拓撲圖如下:
<a href="http://s3.51cto.com/wyfs02/M01/23/AF/wKiom1M-ZE2Qtr1lAAD2vuIjNuQ819.jpg" target="_blank"></a>
三、使用apache的mod_jk來實作反向代理
首先在apache.luojianlong.com上編譯安裝apache
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<code># 安裝apr和apr-util</code>
<code>[root@apache ~]</code><code># tar xvf apr-1.4.6.tar.bz2</code>
<code>[root@apache ~]</code><code># cd apr-1.4.6</code>
<code>[root@apache apr-1.4.6]</code><code># ./configure --prefix=/usr/local/apr --disable-ipv6</code>
<code># 如果報錯rm: cannot remove `libtoolT': No such file or directory</code>
<code># 直接打開 configure,把 $RM “$cfgfile” 那行删除掉,重新再運作</code>
<code># ./configure 就可以了</code>
<code>[root@apache apr-1.4.6]</code><code># make && make install</code>
<code>[root@apache ~]</code><code># tar xvf apr-util-1.5.2.tar.bz2</code>
<code>[root@apache ~]</code><code># cd apr-util-1.5.2</code>
<code>[root@apache apr-util-1.5.2]</code><code># ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr</code>
<code>[root@apache apr-util-1.5.2]</code><code># make && make install</code>
<code># 安裝apache</code>
<code>[root@apache ~]</code><code># tar xvf httpd-2.4.6.tar.bz2</code>
<code>[root@apache ~]</code><code># cd httpd-2.4.6</code>
<code>[root@apache httpd-2.4.6]</code><code># ./configure --prefix=/usr/local/apache \</code>
<code>> --sysconfdir=</code><code>/etc/httpd</code> <code>\</code>
<code>> --</code><code>enable</code><code>-so \</code>
<code>> --</code><code>enable</code><code>-ssl \</code>
<code>> --</code><code>enable</code><code>-cgi \</code>
<code>> --</code><code>enable</code><code>-rewrite \</code>
<code>> --with-zlib \</code>
<code>> --with-pcre \</code>
<code>> --with-apr=</code><code>/usr/local/apr</code> <code>\</code>
<code>> --with-apr-util=</code><code>/usr/local/apr-util</code> <code>\</code>
<code>> --</code><code>enable</code><code>-mpms-shared=all \</code>
<code>> --with-mpm=event \</code>
<code>> --</code><code>enable</code><code>-proxy \</code>
<code>> --</code><code>enable</code><code>-proxy-http \</code>
<code>> --</code><code>enable</code><code>-proxy-ajp \</code>
<code>> --</code><code>enable</code><code>-proxy-balancer \</code>
<code>> --</code><code>enable</code><code>-lbmethod-heartbeat \</code>
<code>> --</code><code>enable</code><code>-heartbeat \</code>
<code>> --</code><code>enable</code><code>-slotmem-shm \</code>
<code>> --</code><code>enable</code><code>-slotmem-plain \</code>
<code>> --</code><code>enable</code><code>-watchdog</code>
<code>[root@apache httpd-2.4.6]</code><code># make && make install</code>
<code>[root@apache ~]</code><code># vi /etc/httpd/httpd.conf</code>
<code># 編輯配置檔案取消下面的這一行的注釋</code>
<code>LoadModule slotmem_shm_module modules</code><code>/mod_slotmem_shm</code><code>.so</code>
<code>[root@apache ~]</code><code># /usr/local/apache/bin/apachectl start</code>
<code>[root@apache ~]</code><code># ps aux | grep apache</code>
<code>root 18345 0.0 0.0 105796 2336 ? Ss 16:59 0:00 </code><code>/usr/local/apache/bin/httpd</code> <code>-k start</code>
<code>daemon 18346 0.2 0.1 450056 4384 ? Sl 16:59 0:00 </code><code>/usr/local/apache/bin/httpd</code> <code>-k start</code>
<code>daemon 18347 0.0 0.1 450056 4384 ? Sl 16:59 0:00 </code><code>/usr/local/apache/bin/httpd</code> <code>-k start</code>
<code>daemon 18348 0.2 0.1 450056 4392 ? Sl 16:59 0:00 </code><code>/usr/local/apache/bin/httpd</code> <code>-k start</code>
在2台tomcat上面安裝tomcat
<code># 首先安裝配置jdk環境</code>
<code>[root@TomcatA ~]</code><code># tar zxvf jdk-7u25-linux-x64.gz -C /usr/local/</code>
<code>[root@TomcatA </code><code>local</code><code>]</code><code># ln -s jdk1.7.0_25 jdk</code>
<code>[root@TomcatA ~]</code><code># vi /etc/profile.d/jdk.sh</code>
<code>export</code> <code>JAVA_HOME=</code><code>/usr/local/jdk</code>
<code>export</code> <code>CLASSPATH=$CLASSPATH:$JAVA_HOME</code><code>/lib</code><code>:$JAVA_HOME</code><code>/jre/lib</code>
<code>export</code> <code>PATH=</code><code>/usr/local/jdk/bin</code><code>:$PATH</code>
<code>[root@TomcatA ~]</code><code># . /etc/profile.d/jdk.sh</code>
<code>[root@TomcatA ~]</code><code># java -version</code>
<code>java version </code><code>"1.7.0_25"</code>
<code>Java(TM) SE Runtime Environment (build 1.7.0_25-b15)</code>
<code>Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)</code>
<code># 安裝配置tomcat</code>
<code>[root@TomcatA ~]</code><code># tar zxvf apache-tomcat-7.0.53.tar.gz -C /usr/local/</code>
<code>[root@TomcatA ~]</code><code># cd /usr/local/</code>
<code>[root@TomcatA </code><code>local</code><code>]</code><code># ln -s apache-tomcat-7.0.53 tomcat</code>
<code>[root@TomcatA ~]</code><code># vi /etc/profile.d/tomcat.sh</code>
<code>export</code> <code>CATALINA_HOME=</code><code>/usr/local/tomcat</code>
<code>export</code> <code>PATH=</code><code>/usr/local/tomcat/bin</code><code>:$PATH</code>
<code>[root@TomcatA ~]</code><code># . /etc/profile.d/tomcat.sh</code>
<code>[root@TomcatA ~]</code><code># catalina.sh start</code>
<code>Using CATALINA_BASE: </code><code>/usr/local/tomcat</code>
<code>Using CATALINA_HOME: </code><code>/usr/local/tomcat</code>
<code>Using CATALINA_TMPDIR: </code><code>/usr/local/tomcat/temp</code>
<code>Using JRE_HOME: </code><code>/usr/local/jdk</code>
<code>Using CLASSPATH: </code><code>/usr/local/tomcat/bin/bootstrap</code><code>.jar:</code><code>/usr/local/tomcat/bin/tomcat-juli</code><code>.jar</code>
<code>Tomcat started.</code>
<code>[root@TomcatA ~]</code><code># jps</code>
<code>18724 Bootstrap</code>
<code>18744 Jps</code>
<code>[root@TomcatA ~]</code><code># ss -antpl | grep :8080</code>
<code>LISTEN 0 100 :::8080 :::* </code><code>users</code><code>:((</code><code>"java"</code><code>,18724,42))</code>
<code>[root@TomcatA ~]</code><code># scp -pr jdk-7u25-linux-x64.gz apache-tomcat-7.0.53.tar.gz [email protected]:/root/</code>
<code># TomcatB上同樣上面的步驟安裝jdk和tomcat</code>
通路都正常
<code>[root@TomcatA ~]</code><code># curl -I http://192.168.30.117:8080</code>
<code>HTTP</code><code>/1</code><code>.1 200 OK</code>
<code>Server: Apache-Coyote</code><code>/1</code><code>.1</code>
<code>Content-Type: text</code><code>/html</code><code>;charset=ISO-8859-1</code>
<code>Transfer-Encoding: chunked</code>
<code>Date: Fri, 04 Apr 2014 09:35:50 GMT</code>
<code>[root@TomcatA ~]</code><code># curl -I http://192.168.30.119:8080</code>
<code>Date: Fri, 04 Apr 2014 09:36:45 GMT</code>
配置基于mod_jk的負載均衡
修改Tomcat配置檔案,添加Host标簽,建立項目加載的類庫檔案夾,并為每一個Tomcat執行個體的引擎添加jvmRoute參數,并通過其為目前引擎設定全局惟一辨別符,需要注意的是,每一個執行個體的jvmRoute的值均不能相同。
<code># 為每一個Tomcat執行個體的引擎添加jvmRoute參數,并通過其為目前引擎設定全局惟一辨別符,需要注意的是,每一個執行個體的jvmRoute的值均不能相同。</code>
<code>[root@TomcatA ~]</code><code># vi /usr/local/tomcat/conf/server.xml</code>
<code># 添加以下内容</code>
<code> </code><code><Engine name=</code><code>"Catalina"</code> <code>defaultHost=</code><code>"192.168.30.117"</code> <code>jvmRoute=</code><code>"TomcatA"</code><code>></code>
<code> </code><code><Host name=</code><code>"192.168.30.117"</code> <code>appBase=</code><code>"/tomcat/web"</code>
<code> </code><code>unpackWARs=</code><code>"true"</code> <code>autoDeploy=</code><code>"true"</code><code>></code>
<code> </code><code><Context path=</code><code>""</code> <code>docBase=</code><code>"/tomcat/web"</code><code>/></code>
<code> </code><code><Valve className=</code><code>"org.apache.catalina.valves.AccessLogValve"</code> <code>directory=</code><code>"logs"</code>
<code> </code><code>prefix=</code><code>"www_access_log."</code> <code>suffix=</code><code>".txt"</code>
<code> </code><code>pattern=</code><code>"%h %l %u %t &quot;%r&quot; %s %b"</code> <code>/></code>
<code> </code><code><</code><code>/Host</code><code>></code>
<code>[root@TomcatA ~]</code><code># mkdir /tomcat/web/WEB-INF/classes -p</code>
<code>[root@TomcatA ~]</code><code># mkdir /tomcat/web/WEB-INF/lib -p</code>
為了友善後面的測試,為2台伺服器分别建立index.jsp測試頁
47
48
49
50
51
<code>[root@TomcatA ~]</code><code># cd /tomcat/web/</code>
<code>[root@TomcatA web]</code><code># vi index.jsp</code>
<code><%@ page language=</code><code>"java"</code> <code>%></code>
<code><html></code>
<code> </code><code><</code><code>head</code><code>><title>TomcatA<</code><code>/title</code><code>><</code><code>/head</code><code>></code>
<code> </code><code><body></code>
<code> </code><code><h1><font color=</code><code>"red"</code><code>>TomcatA <</code><code>/font</code><code>><</code><code>/h1</code><code>></code>
<code> </code><code><table align=</code><code>"centre"</code> <code>border=</code><code>"1"</code><code>></code>
<code> </code><code><</code><code>tr</code><code>></code>
<code> </code><code><td>Session ID<</code><code>/td</code><code>></code>
<code> </code><code><% session.setAttribute(</code><code>"abc"</code><code>,</code><code>"abc"</code><code>); %></code>
<code> </code><code><td><%= session.getId() %><</code><code>/td</code><code>></code>
<code> </code><code><</code><code>/tr</code><code>></code>
<code> </code><code><td>Created on<</code><code>/td</code><code>></code>
<code> </code><code><td><%= session.getCreationTime() %><</code><code>/td</code><code>></code>
<code> </code><code><</code><code>/tr</code><code>></code>
<code> </code><code><</code><code>/table</code><code>></code>
<code> </code><code><</code><code>/body</code><code>></code>
<code><</code><code>/html</code><code>></code>
<code>[root@TomcatA ~]</code><code># catalina.sh stop</code>
<code>[root@TomcatA ~]</code><code># curl http://192.168.30.117:8080/index.jsp</code>
<code> </code>
<code> </code><code><td>AB5025287773B482327CF6F5D982389F.TomcatA<</code><code>/td</code><code>></code>
<code> </code><code><td>1396605416275<</code><code>/td</code><code>></code>
将配置檔案和項目目錄發送到TomcatB伺服器,然後修改
<code>[root@TomcatA ~]</code><code># scp -pr /usr/local/tomcat/conf/server.xml [email protected]:/usr/local/tomcat/conf/</code>
<code>[root@TomcatA ~]</code><code># scp -pr /tomcat/ [email protected]:/</code>
<code>[root@TomcatB ~]</code><code># cd /usr/local/tomcat/conf/</code>
<code>[root@TomcatB conf]</code><code># vi server.xml</code>
<code># 将Engine标簽中的defaulthost的值改為192.168.30.119,jvmRoute的值改為TomcatB,Host标簽中的name的值改為192.168.30.119,jvmRoute的值改為TomcatB</code>
為TomcatB建立測試頁面
<code>[root@TomcatB ~]</code><code># cd /tomcat/web/</code>
<code>[root@TomcatB web]</code><code># vi index.jsp</code>
<code> </code><code><</code><code>head</code><code>><title>TomcatB<</code><code>/title</code><code>><</code><code>/head</code><code>></code>
<code> </code><code><h1><font color=</code><code>"blue"</code><code>>TomcatB <</code><code>/font</code><code>><</code><code>/h1</code><code>></code>
<code>[root@TomcatB ~]</code><code># catalina.sh stop</code>
<code>[root@TomcatB ~]</code><code># catalina.sh start</code>
<code>[root@TomcatB ~]</code><code># curl http://192.168.30.119:8080/index.jsp</code>
<code> </code>
<code> </code><code><td>9F9DAF404E0EDDE92AD63400A4ED8283.TomcatA<</code><code>/td</code><code>></code>
<code> </code><code><td>1396605796342<</code><code>/td</code><code>></code>
配置apache通過mod_jk子產品與Tomcat連接配接,mod_jk是ASF的一個項目,是一個工作于apache端基于AJP協定與Tomcat通信的連接配接器,它是apache的一個子產品,是AJP協定的用戶端(服務端是Tomcat的AJP連接配接器)。
<code>[root@apache ~]</code><code># tar zxvf tomcat-connectors-1.2.37-src.tar.gz</code>
<code>[root@apache ~]</code><code># cd tomcat-connectors-1.2.37-src/native</code>
<code>[root@apache native]</code><code># ./configure --with-apxs=/usr/local/apache/bin/apxs</code>
<code>[root@apache native]</code><code># make && make install</code>
apache要使用mod_jk連接配接器,需要在啟動時加載此連接配接器子產品,為了便于管理與mod_jk子產品相關的配置,這裡使用一個專門的配置檔案/etc/httpd/extra/httpd-jk.conf來儲存相關指令及其設定。其内容如下:
<code>[root@apache ~]</code><code># vi /etc/httpd/extra/httpd-jk.conf</code>
<code>LoadModule jk_module modules</code><code>/mod_jk</code><code>.so</code>
<code>JkWorkersFile </code><code>/etc/httpd/extra/workers</code><code>.properties</code>
<code>JkLogFile logs</code><code>/mod_jk</code><code>.log</code>
<code>JkLogLevel debug</code>
<code>JkMount /* lbcluster1</code>
<code>JkMount </code><code>/jkstatus/</code> <code>stat1</code>
編輯/etc/httpd/extra/workers.properties,添加如下内容:
<code>[root@apache ~]</code><code># vi /etc/httpd/extra/workers.properties</code>
<code>worker.list = lbcluster1,stat1</code>
<code>worker.TomcatA.</code><code>type</code> <code>= ajp13</code>
<code>worker.TomcatA.host = 192.168.30.117</code>
<code>worker.TomcatA.port = 8009</code>
<code>worker.TomcatA.lbfactor = 5</code>
<code>worker.TomcatB.</code><code>type</code> <code>= ajp13</code>
<code>worker.TomcatB.host = 192.168.30.119</code>
<code>worker.TomcatB.port = 8009</code>
<code>worker.TomcatB.lbfactor = 5</code>
<code>worker.lbcluster1.</code><code>type</code> <code>= lb</code>
<code>worker.lbcluster1.sticky_session = 1</code>
<code>worker.lbcluster1.balance_workers = TomcatA, TomcatB</code>
<code>worker.stat1.</code><code>type</code> <code>= status</code>
對于apache代理來說,每一個後端的Tomcat執行個體中的engine都可以視作一個worker,而每一個worker的位址、連接配接器的端口等資訊都需要在apache端指定以便apache可以識别并使用這些worker。約定俗成,配置這些資訊的檔案通常為workers.properties,其具體路徑則是使用前面介紹過的JkWorkersFile指定的,在apache啟動時,mod_jk會掃描此檔案擷取每一個worker的配置資訊。比如,我們這裡使用/etc/httpd/extra/workers.properties。
workers.properties檔案一般由兩類指令組成:一是mod_jk可以連接配接的各worker名稱清單,二是每一個worker的屬性配置資訊。它們分别遵循如下使用文法。
worker.list = < a comma separated list of worker names >
worker. <worker name> .<property> = <property value>
其中worker.list指令可以重複指定多次,而worker name則是Tomcat中engine元件jvmRoute參數的值。如:
worker.TomcatA.host=172.16.100.1
根據其工作機制的不同,worker有多種不同的類型,這是需要為每個worker定義的一項屬性woker.<work name>.type。常見的類型如下:
ajp13:此類型表示目前worker為一個運作着的Tomcat執行個體。
lb:lb即load balancing,專用于負載均衡場景中的woker;此worker并不真正負責處理使用者請求,而是将使用者請求排程給其它類型為ajp13的worker。
status:使用者顯示分布式環境中各實際worker工作狀态的特殊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定義此屬性;
另外,在負載均衡模式中,專用的屬性還有:
balance_workers:用于負載均衡模式中的各worker的名稱清單,需要注意的是,出現在此處的worker名稱一定不能在任何worker.list屬性清單中定義過,并且worker.list屬性中定義的worker名字必須包含負載均衡worker。具體示例請參見後文中的定義。
method:可以設定為R、T或B;預設為R,即根據請求的個數進行排程;T表示根據已經發送給worker的實際流量大小進行排程;B表示根據實際負載情況進行排程。
sticky_session:在将某請求排程至某worker後,源于此址的所有後續請求都将直接排程至此worker,實作将使用者session與某worker綁定。預設為值為1,即啟用此功能。如果後端的各worker之間支援session複制,則可以将此屬性值設為0
除了需要使用LoadModule指令在apache中裝載子產品外,mod_jk還需要在apache的主配置檔案中設定其它一些指令來配置其工作屬性。如JkWorkersFile則用于指定儲存了worker相關工作屬性定義的配置檔案,JkLogFile則用于指定mod_jk子產品的日志檔案,JkLogLevel則可用于指定日志的級别(info, error, debug),此外還可以使用JkRequestLogFormat自定義日志資訊格式。而JkMount(格式: JkMount <URL to match> <Tomcat worker name>)指定則用于控制URL與Tomcat workers的對應關系。
為了讓apache能使用/etc/httpd/extra/httpd-jk.conf配置檔案中的配置資訊,需要編輯/etc/httpd/httpd.conf,添加如下一行:
<code># 添加</code>
<code>Include </code><code>/etc/httpd/extra/httpd-jk</code><code>.conf</code>
<code>[root@apache ~]</code><code># /usr/local/apache/bin/apachectl -t</code>
<code>Syntax OK</code>
<code>[root@apache ~]</code><code># /usr/local/apache/bin/apachectl restart</code>
測試效果
<a href="http://s3.51cto.com/wyfs02/M02/23/B1/wKiom1M-ijXjmUL6AAEAlyeGCjA954.jpg" target="_blank"></a>
測試發現,當worker.lbcluster1.sticky_session = 1時,同一個用戶端通路始終都是TomcatA的頁面
下面修改worker.lbcluster1.sticky_session = 0
<code>worker.lbcluster1.sticky_session = 0</code>
測試發現,通路請求被平均發送到Tomcat A 和 B
<a href="http://s3.51cto.com/wyfs02/M02/23/B1/wKiom1M-iz3BRXAMAADtvrT3NIs620.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/23/B2/wKioL1M-iyHxedKYAAEAlyeGCjA009.jpg" target="_blank"></a>
這樣就展現出Sticky sessions的意義了。
四、配置apache通過mod_proxy子產品與Tomcat連接配接
要使用mod_proxy與Tomcat執行個體連接配接,需要apache已經裝載mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module(實作Tomcat叢集時用到)等子產品:
<code>[root@apache ~]</code><code># /usr/local/apache/bin/httpd -D DUMP_MODULES | grep proxy</code>
<code> </code><code>proxy_module (shared)</code>
<code> </code><code>proxy_connect_module (shared)</code>
<code> </code><code>proxy_ftp_module (shared)</code>
<code> </code><code>proxy_http_module (shared)</code>
<code> </code><code>proxy_fcgi_module (shared)</code>
<code> </code><code>proxy_scgi_module (shared)</code>
<code> </code><code>proxy_wstunnel_module (shared)</code>
<code> </code><code>proxy_ajp_module (shared)</code>
<code> </code><code>proxy_balancer_module (shared)</code>
<code> </code><code>proxy_express_module (shared)</code>
編輯/etc/httpd/extra/mod_proxy.conf
<code>[root@apache ~]</code><code># vi /etc/httpd/extra/mod_proxy.conf</code>
<code>ProxyVia On</code>
<code>ProxyRequests Off</code>
<code>ProxyPreserveHost Off</code>
<code><proxy balancer:</code><code>//lbcluster1</code><code>></code>
<code> </code><code>BalancerMember ajp:</code><code>//192</code><code>.168.30.119:8009 loadfactor=10 route=TomcatA</code>
<code> </code><code>BalancerMember ajp:</code><code>//192</code><code>.168.30.117:8009 loadfactor=10 route=TomcatB</code>
<code> </code><code>ProxySet lbmethod=byrequests</code>
<code><</code><code>/proxy</code><code>></code>
<code><Location </code><code>/balancer-manager</code><code>></code>
<code> </code><code>SetHandler balancer-manager</code>
<code> </code><code>Proxypass !</code>
<code> </code><code>Require all granted</code>
<code><</code><code>/Location</code><code>></code>
<code>ProxyPass / balancer:</code><code>//lbcluster1/</code>
<code>ProxyPassReverse / balancer:</code><code>//lbcluster1/</code>
<code><Proxy *></code>
<code> </code><code>Require all granted</code>
<code><</code><code>/Proxy</code><code>></code>
<code># 為了防止前面使用mod_jk子產品帶來的影響,要注釋掉httpd.conf中的</code>
<code>注釋 Include </code><code>/etc/httpd/extra/httpd-jk</code><code>.conf</code>
<code>添加 Include </code><code>/etc/httpd/extra/mod_proxy</code><code>.conf</code>
關于如上apache指令的說明:
ProxyPreserveHost {On|Off}:如果啟用此功能,代理會将使用者請求封包中的Host:行發送給後端的伺服器,而不再使用ProxyPass指定的伺服器位址。如果想在反向代理中支援虛拟主機,則需要開啟此項,否則就無需打開此功能。
ProxyVia {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多級代理中控制代理請求的流向。預設為Off,即不啟用此功能;On表示每個請求和響應封包均添加Via:;Full表示每個Via:行都會添加目前apache伺服器的版本号資訊;Block表示每個代理請求封包中的Via:都會被移除。
ProxyRequests {On|Off}:是否開啟apache正向代理的功能;啟用此項時為了代理http協定必須啟用mod_proxy_http子產品。同時,如果為apache設定了ProxyPass,則必須将ProxyRequests設定為Off。
ProxyPass [path] !|url [key=value key=value ...]]:将後端伺服器某URL與目前伺服器的某虛拟路徑關聯起來作為提供服務的路徑,path為目前伺服器上的某虛拟路徑,url為後端伺服器上某URL路徑。使用此指令時必須将ProxyRequests的值設定為Off。需要注意的是,如果path以“/”結尾,則對應的url也必須以“/”結尾,反之亦然。
ProxyPassReverse:它一般和ProxyPass指令配合使用,此指令使Apache調整HTTP重定向應答中Location, Content-Location, URI頭裡的URL,這樣可以避免在Apache作為反向代理使用時,後端伺服器的HTTP重定向造成的繞過反向代理的問題,在沒有加這樣的反向代理設定的情況下,通路http://www.test.com/example/a,如果www.example.com對請求進行了redirect至http://www.example.com/b,那麼,用戶端就會繞過反向代理,進而通路http://www.test.com/example/b。如果設定了反向代理,則會在轉交HTTP重定向應答到用戶端之前調整它為http://www.test.com/example/a/b,即是在原請求之後追加上了redirect的路徑。
另外,mod_proxy子產品在httpd 2.1的版本之後支援與後端伺服器的連接配接池功能,連接配接在按需建立在可以儲存至連接配接池中以備進一步使用。連接配接池大小或其它設定可以通過在ProxyPass中使用key=value的方式定義。常用的key如下所示:
min:連接配接池的最小容量,此值與實際連接配接個數無關,僅表示連接配接池最小要初始化的空間大小。
max:連接配接池的最大容量,每個MPM都有自己獨立的容量;都值與MPM本身有關,如Prefork的總是為1,而其它的則取決于ThreadsPerChild指令的值。
loadfactor:用于負載均衡叢集配置中,定義對應後端伺服器的權重,取值範圍為1-100。
retry:當apache将請求發送至後端伺服器得到錯誤響應時等待多長時間以後再重試。機關是秒鐘。
如果Proxy指定是以balancer://開頭,即用于負載均衡叢集時,其還可以接受一些特殊的參數,如下所示:
lbmethod:apache實作負載均衡的排程方法,預設是byrequests,即基于權重将統計請求個數進行排程,bytraffic則執行基于權重的流量計數排程,bybusyness通過考量每個後端伺服器的目前負載進行排程。
maxattempts:放棄請求之前實作故障轉移的次數,預設為1,其最大值不應該大于總的節點數。
nofailover:取值為On或Off,設定為On時表示後端伺服器故障時,使用者的session将損壞;是以,在後端伺服器不支援session複制時可将其設定為On。
stickysession:排程器的sticky session的名字,根據web程式語言的不同,其值為JSESSIONID或PHPSESSIONID。
上述指令除了能在banlancer://或ProxyPass中設定之外,也可使用ProxySet指令直接進行設定。
打開浏覽器測試
<a href="http://s3.51cto.com/wyfs02/M00/23/B2/wKioL1M-ltOzOaVaAAEAlyeGCjA516.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/23/B1/wKiom1M-lwWA7gLUAADtvrT3NIs027.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/23/B2/wKioL1M-l5vTcz3PAAUXcxcSUTo673.jpg" target="_blank"></a>
可以看到倆個後端節點,工作正常。
配置,Tomcat的session叢集複制,
52
53
54
55
56
57
58
59
60
<code># 删除之前新添加的Host,修改Engine中defaultHost的值為localhost</code>
<code>[root@TomcatA ~]</code><code># nano /usr/local/tomcat/conf/server.xml</code>
<code># 在Engine在中添加,address位址改為了本機位址</code>
<code><Cluster className=</code><code>"org.apache.catalina.ha.tcp.SimpleTcpCluster"</code>
<code> </code><code>channelSendOptions=</code><code>"8"</code><code>></code>
<code> </code><code><Manager className=</code><code>"org.apache.catalina.ha.session.DeltaManager"</code>
<code> </code><code>expireSessionsOnShutdown=</code><code>"false"</code>
<code> </code><code>notifyListenersOnReplication=</code><code>"true"</code><code>/></code>
<code> </code><code><Channel className=</code><code>"org.apache.catalina.tribes.group.GroupChannel"</code><code>></code>
<code> </code><code><Membership className=</code><code>"org.apache.catalina.tribes.membership.McastService"</code>
<code> </code><code>address=</code><code>"192.168.30.117"</code>
<code> </code><code>port=</code><code>"45564"</code>
<code> </code><code>frequency=</code><code>"500"</code>
<code> </code><code>dropTime=</code><code>"3000"</code><code>/></code>
<code> </code><code><Receiver className=</code><code>"org.apache.catalina.tribes.transport.nio.NioReceiver"</code>
<code> </code><code>address=</code><code>"auto"</code>
<code> </code><code>port=</code><code>"4000"</code>
<code> </code><code>autoBind=</code><code>"100"</code>
<code> </code><code>selectorTimeout=</code><code>"5000"</code>
<code> </code><code>maxThreads=</code><code>"6"</code><code>/></code>
<code> </code><code><Sender className=</code><code>"org.apache.catalina.tribes.transport.ReplicationTransmitter"</code><code>></code>
<code> </code><code><Transport className=</code><code>"org.apache.catalina.tribes.transport.nio.PooledParallelSender"</code><code>/></code>
<code> </code><code><</code><code>/Sender</code><code>></code>
<code> </code><code><Interceptor className=</code><code>"org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"</code><code>/></code>
<code> </code><code><Interceptor className=</code><code>"org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"</code><code>/></code>
<code> </code><code><</code><code>/Channel</code><code>></code>
<code> </code><code><Valve className=</code><code>"org.apache.catalina.ha.tcp.ReplicationValve"</code>
<code> </code><code>filter=</code><code>""</code><code>/></code>
<code> </code><code><Valve className=</code><code>"org.apache.catalina.ha.session.JvmRouteBinderValve"</code><code>/></code>
<code> </code><code><Deployer className=</code><code>"org.apache.catalina.ha.deploy.FarmWarDeployer"</code>
<code> </code><code>tempDir=</code><code>"/tmp/war-temp/"</code>
<code> </code><code>deployDir=</code><code>"/tmp/war-deploy/"</code>
<code> </code><code>watchDir=</code><code>"/tmp/war-listen/"</code>
<code> </code><code>watchEnabled=</code><code>"false"</code><code>/></code>
<code> </code><code><ClusterListener className=</code><code>"org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"</code><code>/></code>
<code> </code><code><ClusterListener className=</code><code>"org.apache.catalina.ha.session.ClusterSessionListener"</code><code>/></code>
<code> </code><code><</code><code>/Cluster</code><code>></code>
<code>[root@TomcatA ~]</code><code># cp /tomcat/web/index.jsp /usr/local/tomcat/webapps/ROOT/test.jsp</code>
<code>[root@TomcatA ~]</code><code># vi /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml</code>
<code># 在web-app中添加<distributable/></code>
<code># 在TomcatB上做相同的操作</code>
<code># 觀察TomcatA的catalina.out日志</code>
<code>[root@TomcatA ~]</code><code># tail -f /usr/local/tomcat/logs/catalina.out</code>
<code>INFO: Starting clustering manager at localhost</code><code>#</code>
<code>Apr 08, 2014 9:57:02 AM org.apache.catalina.ha.session.DeltaManager getAllClusterSessions</code>
<code>INFO: Manager [localhost</code><code>#], requesting session state from org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 30, 119}:4000,{192, 168, 30, 119},4000, alive=28035, securePort=-1, UDP Port=-1, id={106 18 -38 -75 59 79 79 -35 -86 -72 -23 -20 -3 -80 -105 80 }, payload={}, command={}, domain={}, ]. This operation will timeout if no session state has been received within 60 seconds.</code>
日志顯示叢集session啟動成功
打開浏覽器通路,看下session是否同步
<a href="http://s3.51cto.com/wyfs02/M02/23/C4/wKiom1NDWVizx8vLAADV_2Fjaec678.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/23/C4/wKiom1NDWXLCrxblAADiPdbFUjQ748.jpg" target="_blank"></a>
發現session是相同的
到此,Apache使用倆種方式代理tomcat叢集以及session複制已經配置完成。
本文轉自ljl_19880709 51CTO部落格,原文連結:http://blog.51cto.com/luojianlong/1390767,如需轉載請自行聯系原作者