httpd三種MPM模塊比較

1、httpdlinux

    httpd是由apache軟件基金會開發的一款著名的web服務器軟件。因爲其開放源代碼,而且擁有跨平臺、功能強大、安全穩定等特性,而被普遍使用。早期httpd是在修修補補的基礎上成長起來的,因此早期也叫做a pachey server,因爲開發httpd的組織叫做apache,所以httpd也被稱做apache。httpd有三個長線維護版本,分別是httpd2.0、httpd2.2和httpd2.4。使用最爲普遍的仍是2.2和2.4的版本,雖然兩個版本看起來數字相差不大,可是這兩個版本改變仍是挺大。web

    httpd支持許多特性,大部分特性都是經過編譯模塊實現,所以httpd是以核心加模塊組成的方式工做。httpd的模塊分兩種,一種叫做動態可裝載模塊(DSO),另外一種叫做多道處理模塊(MPM)。DSO動態可裝模塊每一個模塊對應httpd的某項功能,也就是咱們普遍意義上理解的功能模塊。可是,MPM多道處理模塊和DSO不同,它並非指一種模塊,它表明的是httpd的一種工做特性,經常使用的MPM有,prefork、worker、event。apache


2、httpd中prefork、worker、event比較安全

    首先,咱們知道httpd是一個web服務器,基於http協議工做。httpd的工做原理用一句話描述你能夠理解爲,客戶端通過TCP/IP的三次握手與服務器端創建鏈接後,向服務器端的httpd發起一次通話,httpd此時調用一個進程去響應工做,進程取得結果後httpd在結果上包裝一個http響應首部,而後把結果返回給客戶端,鏈接斷開,通話結束。服務器

    客戶端發起一次通話,服務器端就得生成一個進程響應,客戶端發起一百個通話,服務器端就得生成一百個進程,一個進程若是佔用的資源1M,一百個進程就須100M。這中間進程在CPU上執行時,CPU要負責進程之間的切換,屢次切換平白的消耗CPU的執行時間,每一個進程對數據的I/O操做並不多是一次就能完成,一次不能完成工做時,進程就得等待結果,因而進程之間就會產生進程阻塞。進程的這一系列工做下來,能夠想象一個進程對應一個客戶端通訊,效率並非很高,在httpd中,這種工做模式,咱們叫做prerork。併發

    那麼若是咱們想提升一下效率,讓每一個進程不是處理一條響應而是處理多個響應。因而以前咱們須要100個進程完成的工做,如今變成50個了,這樣下來,明顯資源佔用更小了,工做效率也提升了。像這樣的工做模式,在httpd中,咱們叫做worker。ide

    在httpd中,爲了更大的提升效率,咱們不光能夠像worker這樣讓一個進程產生多個線程,每一個線程處理一條客戶端響應,還有一種更高效的工做模式是,一個進程產生多個線程,每一個線程處理多個客戶端響應。像這樣的,在httpd中的工做模式,咱們叫做event。spa

    httpd的三種MPM模式,prerork、worker、event,三種模式能夠看出,event模式的工做效率是最高的,但效率高換來的結果是,只要一條進程的通訊出現了故障,進程僵死,那麼出現的結果將是,那條進程對應的下面多個客戶端通訊集體崩潰。從理論上看,prerork和worker比效,worker的效率要比prerork要高,但實際應用時,在linux操做系統中,httpd的prerork和worker是不分上下的,因此在選擇httpd的MPM模塊時,應結合自身的實際狀況進行選擇。操作系統



prefork(默認) worker event
工做特性 一個進程響應一個請求 一個進程產生多個線程,一個線程響應一個請求 一個進程產生多個線程,一個線程響應多個請求
版本支持 httpd2.二、httpd2.4 httpd2.2httpd2.4 httpd2.4


3、httpd的MPM模塊的相關說明開放源代碼


一、在httpd查中看MPM,可使用httpd -l命令能夠查看httpd當前加載的MPM模塊。

wKioL1Mu77Czx7GqAAB6PmOhOkc086.jpg


二、在httpd2.2中修改/etc/sysconfig/httpd配置文件能夠改變當前服務器所使用的模塊。在編譯安裝httpd2.4時,構建MPM模塊,一般有兩種選擇,一種是把MPM編譯成靜態模塊,還有一種是把MPM編譯成動態模塊。若是把MPM編譯成了靜態模塊,那麼要改變MPM,只能經過從新編譯安裝httpd修改。若是在編譯安裝httpd時,把MPM編譯成了動態模塊,那麼改變MPM,能夠在/etc/httpd/httpd.conf配置文件中編輯LoadModule指令選擇不一樣的MPM從新載入便可。


例如,當前咱們在Centos6.4操做系統中使用yum源安裝的httpd2.2,咱們把默認的prefork模塊修改爲worker模塊的操做以下。

(1)、經過使用httpd -l命令咱們知道當前的MPM模塊是prefork,使用 ps aux 查看httpd進程。

wKioL1Mu8v7xCgMRAAJUB9pfudQ087.jpg


(2)、編輯/etc/sysconfig/httpd文件,修改當前MPM模塊。

wKiom1Mu8-ewp-7lAAIeRh6vceU975.jpg


(3)、從新啓動httpd服務,使用 ps aux 命令查看當前進程,能夠看到修改已經生效了。

wKioL1Mu9COQ5_gxAAGkiz-z7vM724.jpg


三、咱們能夠看到上面prefork的進程數明顯比worker的進程數要多,這些進程的數量是能夠在配置文件中設置的。在httpd2.4中MPM模塊的配置文件爲/etc/httpd/extra/httpd-mpm.conf。httpd2.2只支持prefork和worker模塊,因此在其配置文件/etc/httpd/conf/httpd.conf中,咱們能夠看到如下兩項。

wKiom1Mu9ZXSuby0AACILUMAlgE306.jpgwKiom1Mu9Z-CU5LeAACIa7yBV2M354.jpg


<IFModule></IFModule>這個標籤表示的是,若是加載了指定的那個模塊,則標籤內定義的參數生效。

httpd2.2中prefork和worker各參數說明以下:

<IfModule prefork.c>  若是prefork.c模塊存在,則定義在標籤內的參數有效
    StartServers:     服務開啓時默認啓動的工做進程數,不包括主進程
    MinSpareServers:  最少空閒進程數;
    MaxSpareServers:  最大空閒進程數;
    ServerLimit:      最大活動進程數;
    MaxClients:       併發請求的最大數,一條進程最多能處理多少個請求
    MaxRequestsPerClient: 每一個子進程在生命週期內所可以服務的最多請求個數
</IfModule>


<IfModule worker.c>  若是worker.c模塊存在,則定義在標籤內的參數有效
    StartServers:   服務器開啓時,啓動的子進程的個數
    MaxClients:      併發請求的最大數;
    MinSpareThreads:最小空閒線程數;
    MaxSpareThreads:最大空閒線程數;
    ThreadsPerChild:每一個子進程可生成的線程數;
    MaxRequestsPerChild:每一個子進程在生命週期內所可以服務的最多請求個數,0表示不限定;
</IfModule>



httpd2.4中event參數說明以下:

<IfModule mpm_event_module>
    StartServers             默認進程數
    MinSpareThreads          最小空閒線程數
    MaxSpareThreads          最大空閒線程數
    ThreadsPerChild          每一個子進程能夠生成的線程數
    MaxRequestWorkers        最大線程數量
    MaxConnectionsPerChild   子進程的最大鏈接數,當達到設置值之後,APACHE就會結束當前的子進程
</IfModule>


結語:httpd的MPM模塊一般用來應對各類生產環境的狀況,在生產環境中web服務器的訪問量並非一成不變的,因此有的時候咱們可能須要修改相關參數來應對各類訪問量,熟悉各個模塊的特性及參數配置是頗有必要的!

相關文章
相關標籤/搜索