1. 程式人生 > >httpd的prefork、worker、event

httpd的prefork、worker、event

alt 找到 clas tro work 模型 生成 rlimit 模塊

  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