天天看點

Apache的三種MPM模式及Worker模式配置

Apache的三種MPM模式及Worker模式配置  

配置Apache的Worker模式

其實Apache本身的并發能力是足夠強大的,但是Ubuntu預設安裝的是Prefork模式下的Apache。是以導緻很多人後面盲目的去安裝lighttpd或者nginx一類替代軟體。但是這類軟體有一定的相容問題,部分情況下可能工作的并不好。那麼, 是不是Apache并發就不行了呢?——答案當然是否定的。

在進行配置之前,我們首先要知道什麼是Prefork模式,什麼是Worker模式,什麼是Event模式,以及什麼是MPM。

MPM是Apache2引入的一個概念,就是将結構子產品化。把核心任務處理作為一個可插拔的子產品,即MPM,使其能針對不同的環境進行優化。在這個情況下,就誕生出了處理模式的概念。處理模式現在分為Prefork、Worker、Event三種。

Prefork MPM基于非線程模型,和Apache 1.x版本中的處理方式很相似。Prefork MPM在所有情況下都很安全,對運作非線程安全(non-thread-safe)模式的軟體如PHP,它是唯一的安全選擇。對于某些應用程式,包括在 Apache 1.3上非常流行的程式(如簡單靜态頁面、CGI腳本等),Prefork MPM是最好的選擇。另一方面,prefork用單獨的子程序來處理不同的請求,程序之間是彼此獨立的,這也使其成為最穩定的MPM之一。但是由于每一個請求都會産生一個新的程序,導緻系統資源(尤其是記憶體)消耗的很快,一旦并發量較大的時候,大量的Apache程序會占用巨大的記憶體空間。

而Worker MPM基于線程模式,具有記憶體消耗低(對繁忙的服務很重要)、擴充性在某些特定應用情況下比Prefork更好等優點。在這個模式下,采用的程序和線程混合的形式處理請求。由于使用線程來處理,是以可以處理相對海量的請求,而系統資源的開銷要小于基于程序的Prefork模式。

以上兩種穩定的MPM方式在非常繁忙的伺服器應用下都有些不足。盡管HTTP的Keepalive方式能減少TCP連接配接數量和網絡負載,但是 Keepalive需要和服務程序或者線程綁定,這就導緻一個繁忙的伺服器會耗光所有的線程。Event MPM是解決這個問題的一種新模型,它把服務程序從連接配接中分離出來。在伺服器處理速度很快,同時具有非常高的點選率時,可用的線程數量就是關鍵的資源限 制,此時Event MPM方式是最有效的。一個以Worker MPM方式工作的繁忙伺服器能夠承受每秒好幾萬次的通路量(例如在大型新聞服務站點的高峰時),而Event MPM可以用來處理更高負載。值得注意的是,Event MPM不能在安全HTTP(HTTPS)通路下工作。

一目了然,三種MPM模式各有各的優缺點。但是如果我們經常遇到通路量一大,伺服器資源就吃緊的情況,那麼就是Prefork模式瓶頸了。在其他兩類MPM中,通用的做法還是使用Worker模式來解決問題。Event MPM由于不支援安全連接配接(HTTPS)是以導緻應用有一定的局限性。

下面我們就以Ubuntu下将Apache的模式從Prefork設定為Worker為例,來說明一下操作步驟。前面也提到了,由于Worker模式與PHP的執行方式不同,是以如果簡單的輸入apt-get install apache2-mpm-worker,會導緻PHP無法使用。當然了,如果你的網頁隻有靜态頁面,不需要使用PHP,那麼使用上面這條指令就會搞定一切。這裡我們着重讨論下要使用PHP的情況下,應該如何配置Apache的Worker模式。

1. 安裝Apache的fcgid子產品,使用它來啟用PHP。

#apt-get install libapache2-mod-fcgid
2. 設定fcgid子產品的配置檔案,使其能夠調用PHP。
#vim /etc/apache2/mods-available/fcgid.conf
将檔案内的原來文本全部删除掉,然後添加下面的文本:

<IfModule mod_fcgid.c>

AddHandler fcgid-script .php .py .pl .fcgi

SocketPath /var/lib/apache2/fcgid/sock

IPCConnectTimeout 20

</IfModule>

3. 安裝php5-cgi。
#apt-get install php5-cgi
4. 設定Apache的配置檔案,使其能夠調用fcgid子產品來啟動PHP。
#vim /etc/apache2/apache2.conf
在檔案最後添加下面的内容:

<Directory />

FCGIWrapper /usr/bin/php5-cgi .php

Options ExecCGI SymLinksIfOwnerMatch

</Directory>

5. 安裝Apache的Worker MPM子產品。
#apt-get install apache2-mpm-worker
需要注意的是,如果之前有安裝了php5-gd和php5-mysql子產品,Ubuntu在配置Apache的Worker模式的時候可能會将其解除安裝,可以重新安裝一次以防萬一:
#apt-get install php5-gd php5-mysql
這樣就成功的完成了Apache的Worker MPM子產品配置工作,現在Apache将會以Worker模式運作了。你會發現你的站點負載能力又會大大的提升,記憶體資源也會充裕很多了。

轉載于:https://blog.51cto.com/wanwentao/435861