天天看點

Apache反向代理Tomcat叢集,以及session複制

一、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 &amp;&amp; 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 &amp;&amp; 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>&gt; --sysconfdir=</code><code>/etc/httpd</code> <code>\</code>

<code>&gt; --</code><code>enable</code><code>-so \</code>

<code>&gt; --</code><code>enable</code><code>-ssl \</code>

<code>&gt; --</code><code>enable</code><code>-cgi \</code>

<code>&gt; --</code><code>enable</code><code>-rewrite \</code>

<code>&gt; --with-zlib \</code>

<code>&gt; --with-pcre \</code>

<code>&gt; --with-apr=</code><code>/usr/local/apr</code> <code>\</code>

<code>&gt; --with-apr-util=</code><code>/usr/local/apr-util</code> <code>\</code>

<code>&gt; --</code><code>enable</code><code>-mpms-shared=all \</code>

<code>&gt; --with-mpm=event \</code>

<code>&gt; --</code><code>enable</code><code>-proxy \</code>

<code>&gt; --</code><code>enable</code><code>-proxy-http \</code>

<code>&gt; --</code><code>enable</code><code>-proxy-ajp \</code>

<code>&gt; --</code><code>enable</code><code>-proxy-balancer \</code>

<code>&gt; --</code><code>enable</code><code>-lbmethod-heartbeat \</code>

<code>&gt; --</code><code>enable</code><code>-heartbeat \</code>

<code>&gt; --</code><code>enable</code><code>-slotmem-shm \</code>

<code>&gt; --</code><code>enable</code><code>-slotmem-plain \</code>

<code>&gt; --</code><code>enable</code><code>-watchdog</code>

<code>[root@apache httpd-2.4.6]</code><code># make &amp;&amp; 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>&lt;Engine name=</code><code>"Catalina"</code> <code>defaultHost=</code><code>"192.168.30.117"</code> <code>jvmRoute=</code><code>"TomcatA"</code><code>&gt;</code>

<code>  </code><code>&lt;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>&gt;</code>

<code>  </code><code>&lt;Context path=</code><code>""</code> <code>docBase=</code><code>"/tomcat/web"</code><code>/&gt;</code>

<code>       </code><code>&lt;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 &amp;quot;%r&amp;quot; %s %b"</code> <code>/&gt;</code>

<code>      </code><code>&lt;</code><code>/Host</code><code>&gt;</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>&lt;%@ page language=</code><code>"java"</code> <code>%&gt;</code>

<code>&lt;html&gt;</code>

<code>  </code><code>&lt;</code><code>head</code><code>&gt;&lt;title&gt;TomcatA&lt;</code><code>/title</code><code>&gt;&lt;</code><code>/head</code><code>&gt;</code>

<code>  </code><code>&lt;body&gt;</code>

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

<code>    </code><code>&lt;table align=</code><code>"centre"</code> <code>border=</code><code>"1"</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>tr</code><code>&gt;</code>

<code>        </code><code>&lt;td&gt;Session ID&lt;</code><code>/td</code><code>&gt;</code>

<code>    </code><code>&lt;% session.setAttribute(</code><code>"abc"</code><code>,</code><code>"abc"</code><code>); %&gt;</code>

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

<code>      </code><code>&lt;</code><code>/tr</code><code>&gt;</code>

<code>        </code><code>&lt;td&gt;Created on&lt;</code><code>/td</code><code>&gt;</code>

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

<code>     </code><code>&lt;</code><code>/tr</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>/table</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>/body</code><code>&gt;</code>

<code>&lt;</code><code>/html</code><code>&gt;</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>&lt;td&gt;AB5025287773B482327CF6F5D982389F.TomcatA&lt;</code><code>/td</code><code>&gt;</code>

<code>        </code><code>&lt;td&gt;1396605416275&lt;</code><code>/td</code><code>&gt;</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>&lt;</code><code>head</code><code>&gt;&lt;title&gt;TomcatB&lt;</code><code>/title</code><code>&gt;&lt;</code><code>/head</code><code>&gt;</code>

<code>    </code><code>&lt;h1&gt;&lt;font color=</code><code>"blue"</code><code>&gt;TomcatB &lt;</code><code>/font</code><code>&gt;&lt;</code><code>/h1</code><code>&gt;</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>&lt;td&gt;9F9DAF404E0EDDE92AD63400A4ED8283.TomcatA&lt;</code><code>/td</code><code>&gt;</code>

<code>        </code><code>&lt;td&gt;1396605796342&lt;</code><code>/td</code><code>&gt;</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 &amp;&amp; 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 = &lt; a comma separated list of worker names &gt;

worker. &lt;worker name&gt; .&lt;property&gt; = &lt;property value&gt;

其中worker.list指令可以重複指定多次,而worker name則是Tomcat中engine元件jvmRoute參數的值。如:

worker.TomcatA.host=172.16.100.1

根據其工作機制的不同,worker有多種不同的類型,這是需要為每個worker定義的一項屬性woker.&lt;work name&gt;.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  &lt;URL to match&gt;  &lt;Tomcat worker name&gt;)指定則用于控制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>&lt;proxy balancer:</code><code>//lbcluster1</code><code>&gt;</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>&lt;</code><code>/proxy</code><code>&gt;</code>

<code>&lt;Location </code><code>/balancer-manager</code><code>&gt;</code>

<code>   </code><code>SetHandler balancer-manager</code>

<code>   </code><code>Proxypass !</code>

<code>   </code><code>Require all granted</code>

<code>&lt;</code><code>/Location</code><code>&gt;</code>

<code>ProxyPass / balancer:</code><code>//lbcluster1/</code>

<code>ProxyPassReverse / balancer:</code><code>//lbcluster1/</code>

<code>&lt;Proxy *&gt;</code>

<code>  </code><code>Require all granted</code>

<code>&lt;</code><code>/Proxy</code><code>&gt;</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>&lt;Cluster className=</code><code>"org.apache.catalina.ha.tcp.SimpleTcpCluster"</code>

<code>                 </code><code>channelSendOptions=</code><code>"8"</code><code>&gt;</code>

<code>          </code><code>&lt;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>/&gt;</code>

<code>          </code><code>&lt;Channel className=</code><code>"org.apache.catalina.tribes.group.GroupChannel"</code><code>&gt;</code>

<code>            </code><code>&lt;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>/&gt;</code>

<code>            </code><code>&lt;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>/&gt;</code>

<code>            </code><code>&lt;Sender className=</code><code>"org.apache.catalina.tribes.transport.ReplicationTransmitter"</code><code>&gt;</code>

<code>              </code><code>&lt;Transport className=</code><code>"org.apache.catalina.tribes.transport.nio.PooledParallelSender"</code><code>/&gt;</code>

<code>            </code><code>&lt;</code><code>/Sender</code><code>&gt;</code>

<code>            </code><code>&lt;Interceptor className=</code><code>"org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"</code><code>/&gt;</code>

<code>            </code><code>&lt;Interceptor className=</code><code>"org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"</code><code>/&gt;</code>

<code>          </code><code>&lt;</code><code>/Channel</code><code>&gt;</code>

<code>          </code><code>&lt;Valve className=</code><code>"org.apache.catalina.ha.tcp.ReplicationValve"</code>

<code>                 </code><code>filter=</code><code>""</code><code>/&gt;</code>

<code>          </code><code>&lt;Valve className=</code><code>"org.apache.catalina.ha.session.JvmRouteBinderValve"</code><code>/&gt;</code>

<code>          </code><code>&lt;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>/&gt;</code>

<code>          </code><code>&lt;ClusterListener className=</code><code>"org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"</code><code>/&gt;</code>

<code>          </code><code>&lt;ClusterListener className=</code><code>"org.apache.catalina.ha.session.ClusterSessionListener"</code><code>/&gt;</code>

<code>        </code><code>&lt;</code><code>/Cluster</code><code>&gt;</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中添加&lt;distributable/&gt;</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,如需轉載請自行聯系原作者