web服務器Apache目前一共有三種穩定的MPM(Multi-Processing Module,多進程處理模式 簡稱: MPM) 它們分別是prefork,worker和event,它們同時也代表這Apache的演變和發展。在編譯Apache時必須選擇其中一個MPM,MPM會影響到Apache的速度和可伸縮性。
我們可以使用httpd -V命令查看Apache的工作模式
# httpd -V
Server version: Apache/2.2.34 (Unix)
Server built: Aug 10 2017 03:45:42
Server‘s Module Magic Number: 20051115:43
Server loaded: APR 1.5.2, APR-Util 1.5.4
Compiled using: APR 1.5.2, APR-Util 1.5.4
Architecture: 64-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
編譯的時候,可以通過configure的參數來指定:
–with-mpm=prefork|worker|event
也可以編譯三種都支持–enable-mpms-shared=all,這樣在編譯的時候會在module目錄自動編譯三個MPM文件的so,然後通過修改httpd.conf配置文件更改MPM
這裏使用的是prefork模式,apache2.0默認prefork, 2.2默認為worker, 2.4版本是event
prefork MPM模式
prefork是最早的也是非常穩定的Apache模式,預先建立多個子process(fork),然後等待請求(request )。減少頻繁創建和銷毀進程的開銷。而每個process在某個確定的時間只單獨處理一個連接,效率高,但記憶體使用比較大。
worker MPM模式
worker使用了多進程和muti therad的混合模式,worker模式也同樣預先建立多個子process(fork),然後每個子process創建一些therad,同時包括一個監聽線程,每個請求過來會被分配到一個therad來服務。
event模式
這個是Apache中最新的模式,在現在發布的版本來說很穩定了。event和worker模式很像,不同的是在於它解決了keep-alive長連接的時候佔用thread資源被浪費的問題(HTTP的Keepalive方式能減少TCP連接數量和網路資源),在event工作模式中,會有一些專門的thread用來管理這些keep-alive類型的thread,當有真實請求過來的時候,將請求傳遞給服務器的thread,執行完畢後,又允許它釋放。這增強了在高併發場景下的請求處理能力。
Apache 2.4的官網有一些文件可以自行參考
https://httpd.apache.org/docs/2.4/mpm.html