天天看點

Apache和Nginx負載均衡叢集及測試分析

一、應用場景介紹

本文主要是介紹Apache和Tomcat在Linux環境下的安裝講解以及AJP協定動靜分離負載均衡的實作,以及與Nginx負載性能比較。聯網安裝較為簡單,故此處隻說脫機的Linux環境下是如何安裝的。因為大多數時候,公司的生産環境是在内網環境下,無外網,伺服器處于脫機狀态。

二、 Apache與Tomcat簡介

傳統的Java Web項目是通過tomcat來運作和釋出的。但在實際的企業應用環境中,采用單一的tomcat來維持項目的運作是不現實的。tomcat 處理能力低,效率低,承受并發小(1000左右)。當使用者請求較少時,單一的tomcat能夠快速響應使用者請求,但如果通路量一大,tomcat處理能力跟不上,無法及時響應請求,就會造成使用者等待;如果通路量過大,超出tomcat的承受能力,還可能導緻tomcat超載故障。

    apache 是一個 web 伺服器環境程式,可以作為web 伺服器使用。Apache對并發請求的處理能力較tomcat強,對靜态頁面(如asp,php,cgi,jsp等)的處理上比tomcat更為迅速,但apache不支援動态網頁(需借助tomcat)。

    是以實際應用中可以搭建apache+tomcat負載均衡叢集,一個apache 作為 Web 伺服器,為網站的靜态頁面請求提供服務;并使用tomcat 伺服器作為一個 Servlet/JSP 插件,用于處理網站的動态頁面。當使用者通過浏覽器送出請求時,客戶請求首先會發送到 apache,如果請求是靜态文本則由 apache 解析,并把結果傳回給用戶端;如果是動态的請求,如 jsp,apache 會把解析工作交給 tomcat,由 tomcat 進行解析(這首先要兩者現實整合),tomcat 解析完成後,結果仍是通過 apache 傳回給用戶端。這樣就可以達到分工合作,實作負載均衡,提高系統的性能!

三、安裝環境及工具

系統:CentOS7

  工具:XShell5及Xftp5 (Xshell和Xftp的使用請檢視《離線Nginx配置》此處不再累述)

安裝包:httpd-2.4.28.tar.gz(Apache)  apache-tomcat-8.5.23.tar.gz

軟體下載下傳

1. Apache HTTP Server

位址:http://httpd.apache.org/download.cgi#apache24

2. APR 和 APR-Util

位址:http://apr.apache.org/download.cgi

3. PCRE

位址:https://sourceforge.net/projects/pcre/files/pcre/

基本依賴包的準備(此處其他Linux基本依賴包如gcc安裝不再累述,可檢視《離線Nginx配置》)

apr-1.6.2.tar.gz

apr-util-1.6.0.tar.bz2

pcre-8.30.tar.gz

tomcat-connectors-1.2.42-src.tar.gz

jdk-8u144-linux-x64.rpm

四、安裝依賴包

1、JDK的解除安裝與安裝

因為CentOS自帶有open jdk,需要将其删除,再重新安裝oracle jdk。使用指令# rpm -qa | grep gcj或者# rpm -qa | grep jdk檢視jdk的具體資訊,通過# java -version和裡面的jdk版本比較,用

rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.75-2.5.4.2.el7_0.x86_64

rpm -e --nodeps java-1.7.0-openjdk-1.7.0.75-2.5.4.2.el7_0.x86_64

指令解除安裝相應的jdk;

Apache和Nginx負載均衡叢集及測試分析

然後使用Xftp将我們從oracle下載下傳的jdk版本,放入/usr/local/src/下,使用#cd /usr/local/src/指令進入對應的目錄,使用安裝指令#rpm -ivh jdk-8u144-linux-x64.rpm進行安裝,安裝完成後使用指令#java –version檢視是否安裝成功。

Apache和Nginx負載均衡叢集及測試分析

2、httpd的解除安裝與安裝

2.1解除安裝自帶的httpd

因為有的系統是自帶httpd(apache)的,我們需要先解除安裝掉系統自帶的

  1. 檢視是否有httpd程序正在運作

# ps -ef|grep httpd

Apache和Nginx負載均衡叢集及測試分析

檢視linux系統服務中有沒有httpd 指令# chkconfig –list

Apache和Nginx負載均衡叢集及測試分析

2.有processor或者有service,就執行如下步驟,沒有的話可以跳過此步

關閉httpd服務自啟動,令# chkconfig httpd off

停止httpd服務 ,# service httpd stop

停止後檢視程序processor,如果依然有httpd,手動kill掉

指令# ps -ef|grep httpd

指令# kill -9 pid(pid為上一步查詢到的程序id,逐個都删除)

檢視是否存在rpm安裝的httpd檔案

指令#rpm -qa|grep httpd

根據名字删除包

指令#rpm -e httpd-tools-2.4...

2.2安裝APR、APR-Util、PCRE、Apache

1、先建立對應的4個目錄 

[root@localhost src]# mkdir /usr/local/apache

[root@localhost src]# mkdir /usr/local/apr

[root@localhost src]# mkdir /usr/local/apr-util

[root@localhost src]# mkdir /usr/local/pcre

[root@localhost src]# tar -zxvf apr-1.6.2.tar.gz

[root@localhost src]# tar -jvxf apr-util-1.6.0.tar.bz2

[root@localhost src]# tar -zvxf pcre-8.30.tar.gz

[root@localhost src]# tar -zvxf httpd-2.4.28.tar.gz

[root@localhost src]# cd apr-1.6.2

[root@localhost apr-1.6.2]# ./configure --prefix=/usr/local/apr

[root@localhost apr-1.6.2]# make

[root@localhost apr-1.6.2]# make install

[root@localhost apr-1.6.2]# cd ../apr-util-1.6.0

[root@localhost apr-util-1.6.0]# ./configure --prefix=/usr/local/apr-util

--with-apr=/usr/local/apr/bin/apr-1-config

[root@localhost apr-util-1.6.0]# make

[root@localhost apr-util-1.6.0]# make install

[root@localhost apr-util-1.6.0]# cd ../pcre-8.30

[root@localhost pcre-8.30]# ./configure --prefix=/usr/local/pcre

[root@localhost pcre-8.30]# make

[root@localhost pcre-8.30]# make install

[root@localhost pcre-8.30]# cd ../httpd-2.4.28

此步驟需安裝OpenSSL,之前在Nginx的安裝配置中已安裝,此處不再累述。

[root@localhost httpd-2.4.28]#

./configure --prefix=/usr/local/apache --with-pcre=/usr/local/pcre --with-apr=/usr/local/apr

--with-apr-util=/usr/local/apr-util --enable-so --enable-rewirte --enable-ssl

--with-ssl=/usr/local/openssl--with-ssl=/usr/local/openssl

[root@localhost httpd-2.4.28]# make

[root@localhost httpd-2.4.28]# make install

vim修改httpd.conf檔案的監聽端口以及查找ServerName,打開注釋,将ServerName值改為對應的IP位址。

Apache和Nginx負載均衡叢集及測試分析

2.3啟動Apache

到此可以啟動Apache,進入到安裝目錄 # cd /usr/local/apache/bin ,下面三個指令分别是對應的啟動、停止和重新開機指令。啟動成功後浏覽器中輸入IP:端口即可看到對應的 It works!

[root@localhost bin]# ./apachectl start

[root@localhost bin]# ./apachectl stop

[root@localhost bin]# ./apachectl restart

3、Tomcat安裝

3.1、解壓安裝

由于要在本地開啟兩個tomcat伺服器執行個體以模拟負載均衡+群集的效果,是以我們需要将之前解壓出來的tomcat複制成兩份。使用Xftp将壓縮包放入/usr/local/src中,進入目錄進行解壓。

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

我們可以使用Xftp在/usr/local下建立對應的這兩個檔案夾然後再複制過去,也可以使用指令将解壓的檔案直接拷貝過去。

# cp -r apache-tomcat-8.5.23 ../tomcat8109 ../tomcat8209

3.2啟動與關閉

使用下面2個指令可以啟動或關閉對應的Tomcat服務

# /usr/local/tomcat8080/bin/startup.sh

# /usr/local/tomcat8080/bin/shutdown.sh

4、JK連接配接器安裝

mod_jk是連接配接apache和tomcat叢集的中間件。是以我們需要安裝mod_jk。

使用Xftp将tomcat-connectors-1.2.42-src.tar.gz放入伺服器的/usr/local/src目錄中,并進行解壓。

# tar -zxvf tomcat-connectors-1.2.42-src.tar.gz

進入剛剛解壓出來的tomcat-connector目錄,再進入native目錄。對jk進行編譯和安裝。

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

這裡需要注意的是配置腳本要添加一個apxs完整路徑作為參數。apxs是一個為Apache HTTP伺服器編譯和安裝擴充子產品的工具,用于編譯一個或多個源程式或目标代碼檔案為動态共享對象,使之可以用由mod_so提供的LoadModule指令在運作時加載到Apache伺服器中。

配置完成後執行編譯操作 #make 。編譯完成後使用ls指令來列出native目錄下的所有目錄和檔案。注意有apache-1.3和apache-2.0兩個目錄。由于在配置編譯的時候指定了apxs工具的位置。配置腳本會根據apxs的回報結果自動識别目标apache伺服器為2.x版本,是以本次編譯生成的mod_jk.so子產品會放在apache-2.0目錄中,apache-1.3目錄中是沒有mod_jk.so的,這一點請注意。

我們現在将編譯好的mod_jk.so拷貝到apache伺服器的modules目錄中,這個目錄是專門用來存放擴充子產品的:

# cp ./mod_jk.so  /usr/local/apache/modules/

到此我們的安裝過程就結束了。

五、配置相關檔案

1、Apache配置

1.1httpd.conf配置

我們可以使用Xftp進行到Apache的安裝目錄中,對conf檔案夾中的httpd.conf使用notepad++打開,這裡不推薦使用linux的vim進行編輯,因為檔案行數較多且很多東西直接複制就好。

在有很多LoadModule語句的地方,末尾追加一行

LoadModule jk_module modules/mod_jk.so

然後在寫有<IfModule XXXX>的區域追加一行如下配置

<IfModule jk_module>

  JkWorkersFile conf/workers.properties

  JkMountFile conf/uriworkermap.properties

  JkLogFile logs/mod_jk.log

  JkLogLevel warn

</IfModule>

<IfModule worker.c> 

 StartServers            5 

 ServerLimit            20 

 ThreadLimit           200 

 MaxClients           4000 

 MinSpareThreads        25 

 MaxSpareThreads       250 

 ThreadsPerChild       200 

 MaxRequestsPerChild  1000 

LoadModule表示當apache服務啟動時要加載子產品 jk_module為子產品的别名,後面跟的modules/mod_jk.so就是相對于apache伺服器所在目錄(/usr/local/apache2/)的子產品檔案名。

<IfModule jk_module>區域表示當apache伺服器加載jk_module(在LoadModule指令中指定的子產品别名)子產品時所做的配置。

其中:

JkWorkersFile 指定負載均衡伺服器的配置檔案,檔案名為相對于apache伺服器所在目錄的conf/workers.properties檔案

JkMountFile 指定那些請求交由負載均衡伺服器來處理,那些由apache伺服器來處理,配置檔案為相對于apache伺服器所在目錄的conf/uriworkermap.properties檔案

JkLogFile 指定JK連接配接器的日志輸出檔案,檔案為相對于apache伺服器所在目錄的logs/mod_jk.log檔案

JkLogLevel 指定JK連接配接器輸出日志的級别,級别為warn以上的日志将被輸出到日志檔案中,可選的值級别由低到高分别為:TRACE DEBUG INFO WARN ERROR FATAL

<IfModule worker.c>區域表示當apache伺服器以worker模式工作時使用的配置。

指令說明:

StartServers:設定伺服器啟動時建立的子程序數量。因為子程序數量動态的取決于負載的輕重,所有一般沒有必要調整這個參數。

ServerLimit:伺服器允許配置的程序數上限。隻有在你需要将MaxClients和ThreadsPerChild設定成需要超過預設值16個子程序的時候才需要使用這個指令。不要将該指令的值設定的比MaxClients 和ThreadsPerChild需要的子程序數量高。修改此指令的值必須完全停止服務後再啟動才能生效,以restart方式重新開機動将不會生效。

ThreadLimit:設定每個子程序可配置的線程數ThreadsPerChild上限,該指令的值應當和ThreadsPerChild可能達到的最大值保持一緻。修改此指令的值必須完全停止服務後再啟動才能生效,以restart方式重新開機動将不會生效。

MaxClients:用于伺服用戶端請求的最大接入請求數量(最大線程數)。任何超過MaxClients限制的請求都将進入等候隊列。預設值是"400",16 (ServerLimit)乘以25(ThreadsPerChild)的結果。是以要增加MaxClients的時候,你必須同時增加 ServerLimit的值。筆者建議将初始值設為(以Mb為機關的最大實體記憶體/2),然後根據負載情況進行動态調整。比如一台4G記憶體的機器,那麼初始值就是4000/2=2000。

MinSpareThreads:最小空閑線程數,預設值是"75"。這個MPM将基于整個伺服器監視空閑線程數。如果伺服器中總的空閑線程數太少,子程序将産生新的空閑線程。

MaxSpareThreads:設定最大空閑線程數。預設值是"250"。這個MPM将基于整個伺服器監視空閑線程數。如果伺服器中總的空閑線程數太多,子程序将殺死多餘的空閑線程。MaxSpareThreads的取值範圍是有限制的。Apache将按照如下限制自動修正你設定的值:worker要求其大于等于 MinSpareThreads加上ThreadsPerChild的和。

ThreadsPerChild:每個子程序建立的線程數。預設值是25。子程序在啟動時建立這些線程後就不再建立新的線程了。每個子程序所擁有的所有線程的總數要足夠大,以便可以處理可能的請求高峰。

MaxRequestsPerChild:設定每個子程序在其生存期内允許伺服的最大請求數量。到達MaxRequestsPerChild的限制後,子程序将會結束。如果MaxRequestsPerChild為"0",子程序将永遠不會結束。将MaxRequestsPerChild設定成非零值有兩個好處:可以防止(偶然的)記憶體洩漏無限進行而耗盡記憶體;

給程序一個有限壽命,進而有助于當伺服器負載減輕的時候減少活動程序的數量。

如果設定為非零值,我建議設為10000-30000之間的一個值。

公式:

ThreadLimit >= ThreadsPerChild

MaxClients <= ServerLimit * ThreadsPerChild,并且MaxClients必須是ThreadsPerChild的倍數

MaxSpareThreads >= MinSpareThreads+ThreadsPerChild

1.2 workers.properties和uriworkermap.properties

在Apache的conf目錄下建立兩個檔案,這裡我們可以使用Xftp進行建立,較為友善。

以下為workers.properties  檔案内容:

# workers.properties 

# list the workers by name 

worker.list=loadBalanceServers, jk_watcher 

# localhost server 1 

# ------------------------ 

worker.s1.port=8109 

worker.s1.host=localhost 

worker.s1.route=s1

worker.s1.type=ajp13 

worker.s1.lbfactor=10 

worker.s1.cachesize=5 

worker.s1.connection_pool_size=800 

worker.s1.connection_pool_minsize=25 

worker.s1.connection_pool_timeout=600

# localhost server 2 

worker.s2.port=8209 

worker.s2.host=localhost 

worker.s2.route=s2

worker.s2.type=ajp13 

worker.s2.lbfactor=10 

worker.s2.cachesize=5 

worker.s2.connection_pool_size=800 

worker.s2.connection_pool_minsize=25 

worker.s2.connection_pool_timeout=600

worker.loadBalanceServers.type=lb 

worker.loadBalanceServers.balanced_workers=s1,s2 

worker.loadBalanceServers.sticky_session=false 

worker.jk_watcher.type=status 

# worker.jk_watcher.read_only=True 

worker.jk_watcher.mount=/admin/jk 

worker.retries=3

worker.list 首先配置了兩個worker,一個用于負載均衡,一個用于監視負載均衡狀态。别名分别為loadBalanceServers和jk_watcher

然後分别配置位于本機的兩個負載均衡伺服器

worker.s1.port:第一台負載均衡伺服器AJP協定連接配接器的連接配接端口,這裡配置為8109

worker.s1.host:第一台負載均衡伺服器的主機名、域名或者IP位址,這裡配置為本機localhost

worker.s1.type:JK子產品實作負載均衡采用的是AJP協定1.3版本,是以第一台負載均衡伺服器的類型配置為ajp13

worker.s1.lbfactor:第一台負載均衡伺服器在整個負載均衡系統中所占的權重,這裡配置為10,權重越大,越有可能處理更多的請求,建議給性能好的機器配置更高的權重。

worker.s1.cachesize:apache伺服器是多線程的,tomcat能夠利用這一優勢來維持一定數量的連接配接作為緩存。根據使用者的多少來配置一個合适緩存連接配接數量有助于提高性能。這裡配置為5。

s1是第一台負載均衡伺服器的别名,這個别名要牢記,因為在接下來的配置中還會用到。

s2作為第二台負載均衡伺服器,配置與s1大緻相同。差別是AJP協定連接配接器的連接配接端口與s1的不同,這是因為要在同一台實體機上部署兩個tomcat伺服器的緣故。如果是兩台實體機,則可以配置相同的端口,那麼host屬性就應該不一樣了。兩個tomcat伺服器的權重都是10,則兩個tomcat伺服器将會有相同的處理請求的機會。

worker.loadBalanceServers.type:設定名稱為“loadBalanceServers”的worker類型,這裡配置為lb,也就是Load Balance負載均衡

worker.loadBalanceServers.balanced_workers:設定名稱為“loadBalanceServers”的worker擁有哪些負責負載均衡的伺服器執行個體,這裡配置為s1和s2

worker.loadBalanceServers.sticky_session:設定負載均衡是否采用粘性會話。如果該屬性設定為true,假設一個請求被s1處理了,下次來源于同一個用戶端的請求也将被s1處理。直到s1已經達到最大連接配接數,JK才會将會話切換到其他伺服器上。但是如果恰巧一直負責處理該會話的伺服器down掉了,則會話将會丢失,明顯的故障現象就是關于session的操作會出現莫名其妙的錯誤(例如你所運作的應用中使用者可能已經登入了,但突然在一次通路後莫名其妙地提示沒有登入)。這裡配置為false,不啟用粘性會話,讓伺服器都有機會處理請求,提高了系統的穩定性。

worker.jk_watcher.type:設定名稱為“jk_watcher”的worker類型,這裡配置為status,用于監視各個負載均衡伺服器執行個體的運作狀态

# worker.jk_watcher.read_only:設定名稱為“jk_watcher”的worker是否為隻讀。上面已經将這個worker設定為了監控worker,如果設定為隻讀,就不能對負載均衡伺服器參數進行配置了,這裡先将這條配置注釋掉,預設值為false,表示可以配置參數。

worker.jk_watcher.mount:設定名稱為“jk_watcher”的worker(負載均衡伺服器執行個體螢幕)的挂載路徑,這裡配置為/admin/jk。這樣就可以通過http://127.0.0.1/admin/jk來通路監視工具了,可以很友善地看到各個負載均衡伺服器的工作情況。

worker.retries:這是worker全局的重試次數。在apache伺服器啟動後,會最多嘗試若幹次去連接配接這些負載均衡伺服器,若連接配接不上就認為是down掉了,這裡配置為3。

下面給出uriworkermap.properties配置,其作用是告訴apache伺服器哪些請求由負載均衡伺服器處理:

# uriworkermap.properties 

#define all requests will be submitted to load balance servers 

#if the condition is satisfied, the filter will validate the next statement until it's not. 

#notice the order of the following statements 

/*=loadBalanceServers 

/jkstatus=jk_watcher 

!/*.js  =loadBalanceServers

!/*.css  =loadBalanceServers

!/*.scss =loadBalanceServers

!/*.otf  =loadBalanceServers

!/*.htm  =loadBalanceServers

!/*.html =loadBalanceServers

!/*.gif  =loadBalanceServers

!/*.jpg  =loadBalanceServers

!/*.jpeg =loadBalanceServers

!/*.png  =loadBalanceServers

!/*.bmp  =loadBalanceServers

!/*.swf  =loadBalanceServers

!/*.ioc  =loadBalanceServers

!/*.iocn  =loadBalanceServers

!/*.rar  =loadBalanceServers

!/*.zip  =loadBalanceServers

!/*.txt  =loadBalanceServers

!/*.flv  =loadBalanceServers

!/*.mid  =loadBalanceServers

!/*.doc  =loadBalanceServers

!/*.ppt  =loadBalanceServers

!/*.pdf  =loadBalanceServers

!/*.xls  =loadBalanceServers

!/*.mp3  =loadBalanceServers

!/*.wma  =loadBalanceServers

!/*.eot  =loadBalanceServers

!/*.svg  =loadBalanceServers

!/*.ttf  =loadBalanceServers

!/*.woff =loadBalanceServers

!/*.map  =loadBalanceServers

!/*.woff2=loadBalanceServers

!/*.ogg  =loadBalanceServers

在配置檔案中,以“!”開頭的條件表示“不要”,“=”表示交給。

是以條件“/*=loadBalanceServers”表示将任何請求交給負載均衡伺服器。

條件“!/*.jpg=loadBalanceServers”表示不要将.jpg結尾的請求交給負載均衡伺服器

apache伺服器接收到一個請求後會按照配置檔案中的限制條件一個一個地檢查,然後按照最後滿足的比對條件來決定由哪個worker來處理請求。

2、Tomcat配置

因為是在同一台伺服器上部署,是以端口号不能沖突,這裡給出一個tomcat 的server.xml配置資訊。

<?xml version='1.0' encoding='utf-8'?> 

<!--指定tomcat伺服器的Telnet登入端口 并設定關閉伺服器指令為"SHUTDOWN" 此處需注意伺服器安全 --> 

<Server port="8005" shutdown="SHUTDOWN"> 

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

  <!-- Prevent memory leaks due to use of particular java/javax APIs-->

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

    <GlobalNamingResources> 

        <Resource name="UserDatabase" auth="Container" 

            type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" 

            factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 

            pathname="conf/tomcat-users.xml" /> 

    </GlobalNamingResources> 

    <Service name="Catalina"> 

        <!-- HTTP服務端口 若在同一台機器上運作兩個Tomcat執行個體 需要修改這個端口 具體數值無要求 不重複即可 --> 

        <Connector port="8081" protocol="HTTP/1.1" 

            connectionTimeout="20000" redirectPort="8443" /> 

        <!-- 此處的端口要與workers.properties檔案中s1負載均衡伺服器一緻 --> 

        <Connector port="8109" protocol="AJP/1.3" redirectPort="8443" maxThreads="1000" URIEncoding="UTF-8" /> 

        <!-- jvmRoute屬性用來負載均衡的轉發對象 值一定要與在workers.properties檔案中指定的另外一台一樣 --> 

        <!-- 本實驗中有兩個tomcat伺服器執行個體,是以s1伺服器指向的轉發對象為s2,s2伺服器的這個地方要設定為s1 --> 

        <!-- 如果有三個tomcat伺服器執行個體做負載均衡,需要設定為s1->s2, s2->s3, s3->s1 -->        

        <Engine name="Catalina" defaultHost="localhost" jvmRoute="s2"> 

            <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 

                resourceName="UserDatabase" /> 

            <Host name="localhost" appBase="webapps" unpackWARs="true" 

                autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> 

                <!-- 開始配置叢集 --> 

                <!-- 如果僅配置負載均衡,隻需要将Cluster标簽注釋掉 --> 

                <!-- 如果使用群集,應用的web.xml要加上distributable标簽 --> 

                                     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"

                                                         channelSendOptions="8">

                                       <Manager className="org.apache.catalina.ha.session.DeltaManager"

                                                           expireSessionsOnShutdown="false"

                                                           notifyListenersOnReplication="true"/>

                                       <Channel className="org.apache.catalina.tribes.group.GroupChannel">

                                               <Membership className="org.apache.catalina.tribes.membership.McastService"

                                                                           address="228.0.0.4"

                                                                           port="45564"

                                                                           frequency="500"

                                                                           dropTime="3000"/>

                                               <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

                                                                   address="auto"

                                                                   port="4000"

                                                                   autoBind="100"

                                                                   selectorTimeout="5000"

                                                                   maxThreads="6"/>

                                               <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">

                                                 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>

                                               </Sender>

                                               <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>

                                               <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>

                                       </Channel>

                                       <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"

                                                         filter=""/>

                                       <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

                                       <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

                                     </Cluster>

                <!-- 結束配置群集 --> 

            </Host>  

        </Engine> 

    </Service> 

</Server> 

到此我們就配置完成了,可以對其進行測試了。

六、測試比較

1、Window和Linux的比較

目前我們使用的是在window下面的Apache與Tomcat部署的動靜分離負載均衡的服務。這裡我們對window下使用Apache、Linux下使用Nginx、Linux下使用Apache進行測試。對于window下的AJP動靜分離負載均衡和Linux下Nginx等配置不再累述,隻進行相關測

我們使用jmeter進行相關測試,啟用5個jmeter線程,每個線程進行2000次請求,每次請求相隔1s,執行對應的測試。

window下的Apache和Tomcat叢集請求結果

Apache和Nginx負載均衡叢集及測試分析

Linux下Apache和Tomcat動靜分離後的叢集請求結果

Apache和Nginx負載均衡叢集及測試分析

Linux下Nginx和Tomcat動靜分離後的叢集請求結果

Apache和Nginx負載均衡叢集及測試分析

從3個圖中我們可以很明顯的看到,window伺服器下無論是從伺服器的吞吐量還是請求響應的時間來看都遠遠的低于Linux系統,而在Linux系統下Apache和Nginx的性能則相差不大。

2、Nginx和Apache的比較

因為在請求較少的情況下二者差别不大,是以我們加大并發量,來測試Linux中高并發的情況下Apache與Nginx的性能。采用500個線程并發,同時在間隔1s的時間内循環請求100次。這樣的并發下我們就可以發現Nginx與Apache的差異了。

Nginx高并發下的請求結果

Apache和Nginx負載均衡叢集及測試分析

Apache高并發下的請求結果

Apache和Nginx負載均衡叢集及測試分析

從圖中我們可以看到,Apache在高并發的情況下響應時間比Nginx短,而且吞吐量較大,但是請求錯誤率卻高達25%,這是無法忍受的。而Nginx相對而言的話,在高并發下響應時間沒有Apache快,但是請求失敗的情況隻有0.01%,幾乎可以忽略不計。

3、結論

從上面的測試我們可以得出結論,Apache在處理動态請求時效率比Nginx要好,但是對于高并發的情況,Nginx則比起Apache來說,性能要好。從現在的實際情況來考慮的話,在Linux下使用Nginx是一個更好的選擇。