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.2、httpd2.4 | httpd2.4 |
3、httpd的MPM模塊的相關說明開放源代碼
一、在httpd查中看MPM,可使用httpd -l命令能夠查看httpd當前加載的MPM模塊。
二、在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進程。
(2)、編輯/etc/sysconfig/httpd文件,修改當前MPM模塊。
(3)、從新啓動httpd服務,使用 ps aux 命令查看當前進程,能夠看到修改已經生效了。
三、咱們能夠看到上面prefork的進程數明顯比worker的進程數要多,這些進程的數量是能夠在配置文件中設置的。在httpd2.4中MPM模塊的配置文件爲/etc/httpd/extra/httpd-mpm.conf。httpd2.2只支持prefork和worker模塊,因此在其配置文件/etc/httpd/conf/httpd.conf中,咱們能夠看到如下兩項。
<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服務器的訪問量並非一成不變的,因此有的時候咱們可能須要修改相關參數來應對各類訪問量,熟悉各個模塊的特性及參數配置是頗有必要的!