Apache-2.2

如何選擇要使用的 Apache MPM?

  • June 8, 2019

這是關於選擇正確的 Apache httpd MPM的規範問題。

我對 Apache 提供的不同 MPM 有點困惑——“worker”、“event”、“prefork”等。

它們之間的主要區別是什麼,我如何確定哪個最適合給定部署?

有許多MPM 模組(多處理模組),但迄今為止使用最廣泛(至少在 *nix 平台上)是三個主要模組:preforkworkerevent. 從本質上講,它們代表了 Apache Web 伺服器的演變,以及伺服器在其長期(以軟體方面)歷史的計算限制內處理 HTTP 請求的不同方式。


prefork

mpm_prefork是..好吧..它與一切兼容。它衍生出許多子程序來處理請求,並且子程序一次只處理一個請求。因為它讓伺服器程序坐在那裡,準備採取行動,並且不需要處理執行緒封送處理,所以當您一次只處理一個請求時,它實際上比更現代的執行緒 MPM 更快 - 但並發請求會受到影響*,*因為他們被迫排隊等待伺服器程序空閒。此外,如果嘗試增加 prefork 子程序的數量,您將很容易消耗掉一些嚴重的 RAM。

除非您需要一個不是執行緒安全的模組,否則可能不建議使用 prefork。

**在以下情況下使用:**您需要在使用執行緒時中斷的模組,例如mod_php. 即便如此,考慮使用 FastCGI 和php-fpm.

**不要在以下情況下使用:**您的模組不會中斷執行緒。

worker

mpm_worker使用執行緒——這對並發性有很大幫助。Worker 剝離了一些子程序,這些子程序又剝離了子執行緒;與 prefork 類似,如果可能,一些備用執行緒會保持準備就緒,以服務傳入連接。這種方法在 RAM 上要好得多,因為執行緒數不像 prefork 中的伺服器數那樣直接影響記憶體使用。它還更容易處理並發,因為連接只需要等待空閒執行緒(通常可用)而不是 prefork 中的備用伺服器。

**在以下情況下使用:**您使用的是 Apache 2.2 或 2.4,並且主要執行 SSL。

**不要使用 if:**你真的不會出錯,除非你需要 prefork 來兼容。

但是,請注意,執行緒附加到連接而不是請求- 這意味著保持活動連接始終保持執行緒保持直到它關閉(這可能很長時間,具體取決於您的配置)。這就是為什麼我們有..

event

mpm_event在結構上與工人非常相似;它剛剛在 Apache 2.4 中從“實驗”狀態變為“穩定”狀態。最大的區別在於它使用專用執行緒來處理保持活動連接,並且僅在實際發出請求時才將請求傳遞給子執行緒(允許這些執行緒在請求完成後立即釋放備份)。這對於不一定一次全部處於活動狀態但偶爾發出請求的客戶端的並發性非常有用,並且當客戶端可能有很長的保持活動超時時。

這裡的例外是 SSL 連接。在這種情況下,它的行為與 worker 相同(將給定的連接粘合到給定的執行緒,直到連接關閉)。

**在以下情況下使用:**您使用的是 Apache 2.4 並且喜歡執行緒,但您不喜歡讓執行緒等待空閒連接。每個人都喜歡執行緒!

**不要在以下情況下使用:**您不在 Apache 2.4 上,或者您需要 prefork 以實現兼容性。


在當今的slowloris、AJAX 和喜歡將6 個TCP 連接(當然是keep-alive)多路復用到您的伺服器的瀏覽器的世界中,並發性是使您的伺服器擴展和良好擴展的重要因素。Apache 的歷史在這方面將其束縛住了,雖然它在資源使用或規模方面仍然無法與 nginx 或 lighttpd 之類的東西相提並論,但很明顯,開發團隊正在努力建構一個仍然相關的 Web 伺服器在當今的高請求並發世界中。

引用自:https://serverfault.com/questions/383526