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

来源:https://www.cnblogs.com/tigerchen666/archive/2018/08/29/9552430.html
-Advertisement-
Play Games

一、應用場景介紹 本文主要是介紹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)的,我們需要先卸載掉系統自帶的

  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是一個更好的選擇。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 雖然按照網上教程一步一步來,但還是遇到了幾個錯誤點,現整理出來,主要是自己做個筆記,同時也希望能幫助到其他像我一樣第一次在Xcode上搭建Python環境的人。首先感謝原作者:https://zhidao.baidu.com/question/2078353563211972948.html,我加上 ...
  • pwd命令以絕對路徑的方式顯示用戶當前工作目錄。 語法 選項 實例 ...
  • 一、啟動 cd usr/local/nginx/sbin ./nginx 二、重啟 更改配置重啟nginx 判斷配置文件是否正確 三、關閉 查詢nginx主進程號 ps -ef | grep nginx 從容停止 kill -QUIT 主進程號 快速停止 kill -TERM 主進程號 強制停止 k ...
  • [toc] 1. 安裝顯卡驅動 檢測顯卡驅動及型號 添加ELPepo源 安裝NVIDIA驅動檢測 2. 安裝CUDA\CUDNN 2.1 cuda 官網下載cuda,最好下載9.0版本: "https://developer.nvidia.com/cuda toolkit archive" 選擇符合 ...
  • 很多人都有使用綠色軟體的習慣,在這裡我簡單稱其為Portable App 將這些軟甲放到U盤中隨身攜帶,便於我們使用更加符合自身習慣的功能軟體。 相信習慣將軟體放到U盤啟動都會碰到一個問題,就是每次打開這些軟體就需要在目錄中尋找對應的啟動文件了。 多數人日常生活中都會通過使用快捷方式啟動軟體,那麼我 ...
  • asyncio模塊是python之父寫的模塊,按說應該是靠譜的,python3.6版本定義為穩定版本。 說明書:https://docs.python.org/3/library/asyncio.html?highlight=asyncio#module-asyncio 大概定義:該模塊提供了使用協 ...
  • 註意:字體文件必須是TTF或者ttf格式的文件, 1、yum install -y fontconfig mkfontscale2、mkdir -p /usr/share/fonts/windows_fonts3、上傳ttf格式的字體文件到 /usr/share/fonts/windows_font ...
  • 安裝的 ESXi 的物理主機密碼忘記,登錄 不上了,需要重新安裝 ESXi,安裝後恢複原先物理主機上的 虛擬機的方法如下(VMFS分區完好): 關於 VMFS 分區: ESXi 的安裝時會劃分一個分區用於 VMFS文件系統。而 ESXi 的虛擬機就安裝在 VMFS分區中,所以只要 VMFS 分區沒有 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...