一、應用場景介紹 本文主要是介紹Apache和Tomcat在Linux環境下的安裝講解以及AJP協議動靜分離負載均衡的實現,以及與Nginx負載性能比較。聯網安裝較為簡單,故此處只說離線的Linux環境下是如何安裝的。因為大多數時候,公司的生產環境是在內網環境下,無外網,伺服器處於離線狀態。 二、 ...
一、應用場景介紹
本文主要是介紹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)的,我們需要先卸載掉系統自帶的
- 查看是否有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是一個更好的選擇。