httpd的prefork、worker、event
Apache(httpd) 有3種核心MPM(Multi-Processing Module,多進程處理模塊)工作模式,分別是prefork,worker和event,其中httpd-2.2的event模式仍然為測試使用的模型,而httpd-2.4的event模式則可在生產環境中使用。如果是通過yum安裝的httpd服務,3種工作模式的配置文件默認在/etc/httpd/conf/httpd.conf中。
prefork MPM,多進程模型,每個進程響應一個請求
一個主進程:負責生成子進程及回收子進程,負責創建套接字,負責接收請求並將其派發給某子進程進行處理;
n個子進程:每個子進程處理一個請求;
工作模型:會預先生成幾個空閑進程,隨時等待用於響應用戶請求。
prefork的默認配置(httpd2.2) <IfModule prefork.c> StartServers 8 #進程啟動後立即啟動的空閑進程數量 MinSpareServers 5 #最小空閑進程數量 MaxSpareServers 20 #最大空閑進程數量 ServerLimit 256 #一個周期內允許最大的進程數量 MaxClients 256 #最大允許啟動的服務器子進程數量 MaxRequestsPerChild 4000 #允許最大請求的數量(超過數量就會關閉該進程,設置為0則永不過期)</IfModule>
worker MPM,多進程多線程模型,每個線程處理一個用戶請求
一個主進程:負責生成子進程,創建套接字;負責接收請求,並將其派發給某子進程進行處理;
n個子進程:每個子進程負責生成多個線程;
每個線程:負責響應用戶請求,其並發響應數量為:m*n (m:子進程數量;n:每個子進程所能創建的最大線程數量)。
worker的默認配置(httpd2.2) <IfModule worker.c> StartServers 3 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 #每個子進程所能創建的最大線程數量 MaxRequestsPerChild 0 #0表示不限制</IfModule>
event MPM,事件驅動模型(多進程模式),每個進程響應多個請求
一個主進程 :負責生成子進程,負責創建套接字,負責接收請求並將其派發給某子進程進行處理
n個子進程:基於事件驅動機制直接響應多個請求,其並發響應數量為:m*n (m:子進程數量;n:每個子進程響應的請求數量)。
<IfModule mpm_event_module>(httpd2.4)
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
附:httpd2.2默認沒有給出event模型的配置內容,但從測試運行的結果來看,配置應該同worker模型接近。
對比httpd2.2和httpd2.4
①httpd2.2不支持同時編譯多個MPM模塊,只能在編譯時選定要使用哪個,為此rpm包提供了三個應用程序文件:httpd(prefork), httpd.worker, httpd.event,分別用於實現對不同的MPM機制的支持;默認使用的模塊為/usr/sbin/httpd,其為prefork的MPM模塊。
如果要更改MPM,直接修改配置文件/etc/sysconfig/httpd:
HTTPD=/usr/sbin/httpd.{worker,event}
修改後重啟服務service httpd restart,此時可通過 ps aux | grep httpd 或 htttpd -M | grep mpm查看是否更換成功。
②httpd2.4支持動態編譯多個MPM模塊,如果要更換MPM,修改配置文件 /etc/httpd/conf.modules.d/00-pmp.conf:
LoadModule mpm_{worker,event}_module modules/mod_mpm_{worker,event}.so
修改後重啟服務systemctl restart httpd.service,此時可通過 ps aux | grep httpd或 htttpd -M | grep mpm查看是否更換成功。
附:httpd2.4.6沒有直接給出3種mpm的默認配置,但是通過/usr/share/doc/httpd-2.4.6/httpd-mpm.conf文件可以查看到相關的配置;如果我們想修改配置可參考文檔修改/etc/httpd/conf/httpd.conf文件即可。此處我修改了worker mpm,內容如下:
httpd2.4切換成worker模型,需要修改配置文件/etc/httpd/conf.modules.d/00-mpm.conf,內容如下:
重新啟動httpd服務,發現有7條線程;即使是默認的配置也是會多出1條線程,沒有找到原因:
httpd的prefork、worker、event