Apache 在不同平台有不同的 MPM
Netware | mpm_netware |
OS/2 | mpmt_os2 |
Unix | prefork,worker 或 event |
Windows | mpm_winnt |
- perfork MPM:預先創建進程 (1個主進程,多個子進程)
分為「監聽者、工作者、空閒者」。
leader/follower模型。
只有一個監聽者,當發生請求時,監聽者變為工作者,原本的空閒者相互競爭,然後其中一個變為監聽者。
請求處理完畢,工作者變回空閒者。
在windows上進程代價太高,所以不使用。
極端情況:所有進程都成為工作者,將變成沒有監聽者,也就無法處理新的請求 - worker MPM:線程化,同時使用進程與線程(主進程、多個工作子進程、多個工作線程)
主進程啟動後,建立數個工作子進程,每個子進程又會建立多個固定數量的工作線程。
工作線程分為「監聽線程、工作線程」,監聽線程用來監聽並接受連接,放到佇列,工作線程從佇列取得連接處理。
因使用線程,所以所有模組都要是線程安全的。
缺點,線程掛掉其他線程也會崩潰。 - event MPM:worker的變種。
- winnt MPM:有兩個進程(1個監控進程、1個工作進程),工作進程再產生多個線程。
使用線程當做基本運行單元,因為windows下,進程需耗費很多資源。
線程數固定。
監控線程(主進程),用來監控工作進程,確保工作進程正常,若發現工作進程發生異常,主進程會重新啟動工作進程。
工作進程內部的線程可區分為「監聽線程、工作線程」。監聽線程用來負責接受請求,工作線程則負責處理這些請求。
如果要在 windows 修改 mpm 設定,以 apache 2.2 為例
- 修改 httpd.conf,include conf/extra/httpd-mpm.conf (拿掉下面一行的註解)
Include conf/extra/httpd-mpm.conf
- 修改 conf/extra/httpd-mpm.conf 設定,httpd-mpm.conf 裡面有各種 MPM 的設定,因在 windows 上面,所以找到 WinNT MPM,將 ThreadsPerChild 的數字改大一點,可增加可處理的連線數。
<IfModule mpm_winnt_module> ThreadsPerChild 800 MaxRequestsPerChild 0 </IfModule>
其他:使用 httpd -l,可列出目前正使用的 mpm 模組,例:
D:\Apache\bin>httpd -l Compiled in modules: core.c mod_win32.c mpm_winnt.c http_core.c mod_so.c
參考:
http://httpd.apache.org/docs/2.4/mpm.html
http://blog.yam.com/htshboy/article/17182660
http://www.aminglinux.com/bbs/thread-579-1-1.html
http://www.cnblogs.com/fnng/archive/2012/11/20/2779977.html
Apache httpd-mpm.conf参数配置说明
原來在Windows環境要這樣設定!真是太感謝你了!
回覆刪除