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;

 

 

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

 

 

2、httpd的卸載與安裝

2.1卸載自帶的httpd

因為有的系統是自帶httpd(apache)的,我們需要先卸載掉系統自帶的

  1. 查看是否有httpd進程正在運行

# ps -ef|grep httpd

 

 

查看linux系統服務中有沒有httpd 命令# chkconfig –list

 

 

 

 

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

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

[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地址。

 

 

 

 

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 

</IfModule>

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集群請求結果

 

 

Linux下Apache和Tomcat動靜分離后的集群請求結果

 

 

Linux下Nginx和Tomcat動靜分離后的集群請求結果

 

 

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

 

2、Nginx和Apache的比較

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

Nginx高並發下的請求結果

 

 

 

Apache高並發下的請求結果

 

 

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

3、結論

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM