1. 程式人生 > >apache的三種工作模式

apache的三種工作模式

httpd

web服務器Apache目前一共有三種穩定的MPM(Multi-Processing Module,多進程處理模式)

它們分別是prefork、worker和event,它們同時也代表這Apache的 演變和發展

使用httpd -V命令查看Apache的工作模式,如我安裝的httpd-2.2版本


[[email protected] ~]# 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)

這裏使用的是prefork模式,apache2.0默認prefork, 2.2默認為worker, 2.4版本是event

在configure配置編譯參數的時候,可以使用–with-mpm=prefork|worker|event來指定編譯為哪一種mpm, 也可以編譯三種都支持–enable-mpms-shared=all

,這樣在編譯的時候會在module目錄自動編譯三個MPM文件的so,然後通過修改httpd.conf配置文件更改MPM

1、Prefork MPM

Prefork MPM實現了一個非線程的、預派生的web服務器。它在Apache啟動之初,就先預先派生一些子進程,然後等待連接;可以減少頻繁創建和銷毀進程的開銷,每個子進程只有一個線程,在一個時間點內,只能出來一個請求。這是一個成熟穩定,可以兼容新老模塊,也不需要擔心線程安全問題,但是一個進程相對占用資源,消耗大量內存,不擅長處理高並發的場景

技術分享

配置方法:

<IfModule mpm_prefork_module>

StartServers 5

MinSpareServers 5

MaxSpareServers 10

MaxClients 250

MaxRequestsPerChild 1000

</IfModule>


StartServers

#服務器啟動時建立的子進程數量


MinSpareServers

#空閑子進程的最小數量,默認5;如果空閑子進程數少於MinSpareServers,那麽Apache將以最大每秒一個的速度產生新的子進程。此參數不要設的太大


MaxSpareServers

#空閑子進程的最大數量,默認是10;如果當前有超過MaxSpareServers數量的空閑子進程,那麽父進程會殺死多余的子進程。此參數不需要設置太大,如果你將其設置比MinSpareServers小,Apache會自動修改為MinSpareServers+1的數量


MaxClients

#限定服務器同一時間內客戶端最大連接的請求數量,默認是256;任何超過了Maxclients限制的請求都要進入等待隊列,一旦一個個連接被釋放,隊列中的請求才將得到服務,如果要增大這個數值,必須先增大ServerLimit,在Apache2.3.1版本之後這個參數MaxClients被稱為MaxRequestWorkers.


MaxRequestsPerChild

#每個子進程在其生命周期內允許最大的請求數量,如果請求總數已經達到這個數值,子進程將會結束,如果設置為0,子進程將永遠不會結束。在Apache2.3.9之後稱之為MaxConnectionsPerChild。

這裏建議設置非零,原因:

1).能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。

2).給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量(重生的機會)。

2、Worker MPM

和prefork模式相比,worker使用了多進程和多線程的混合模式,worker模式也同樣會預先派生一些子進程,然後每個子進程創建一些線程,同時包括一個監聽線程,每個請求過來會被分配到一個線程來服務。線程比起進程會更輕量,因為線程是通過共享父進程的內存空間,因此,內存的占用會減少一些,在高並發的場景下worker會比prefork有更多可用的線程,表現的會更優秀一些;另外,如果一個線程出現了問題也會導致同一進程下的線程出現問題,如果是多個線程出現問題,也只是影響Apache的一部分,而不是全部,由於用到多進程多線程,需要考慮到線程的安全了,在使用keep-alive長連接的時候,某個線程會一直被占用,即使中間沒有請求,需要等待到超時才會被釋放(該問題在prefork模式下也存在)。

技術分享

<IfModule mpm_worker_module>

StartServers 3

ServerLimit 16

MinSpareThreads 25

MaxSpareThreads 75

ThreadsPerChild 25

Maxclients 400

MaxRequestPerChild 1000

</IfModule>


StartServers

#服務器啟動時建立的子進程數量,在worker模式下默認是3.

ServerLimit

#系統配置的最大進程數量

MinSpareThreads

#空閑子進程的最小數量,默認25

MaxSpareThreads

#空閑子進程的最大數量,默認75

ThreadsPerChild

#每個子進程產生的線程數量,默認25

Maxclients

#限定服務器同一時間內客戶端最大接入的請求數量

在Apache2.3.9之後稱之為MaxRequestWorkers。

MaxRequestsPerChild

每個子進程在其生命周期內允許最大的請求數量,如果請求總數已經達到這個數值,子進程將會結束,如果設置為0,子進程將永遠不會結束。在Apache2.3.9之後稱之為MaxConnectionsPerChild。

這裏建議設置非零,原因:

1).能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。

2).給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量(重生的機會)。

worker模式下所能同時處理的請求總數是由子進程總數乘以ThreadsPerChild值決定的,應該大於等於MaxClients。如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。默認的最大子進程總數是16,加大時,也需要顯式聲明ServerLimit(最大值是20000)。需要註意的是,如果顯式聲明了ServerLimit,那麽它乘以ThreadsPerChild的值必須大於等於Maxclients,而且MaxClients必須是ThreadsPerChild的整數倍,否則Apache將會自動調節到一個相應值。


3、Event MPM

這是apache最新的工作模式,它和worker模式很像,不同的是在於它解決了keep-alive長連接的時候占用線程資源被浪費的問題,在event工作模式中,會有一些專門的線程用來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務器的線程,執行完畢後,又允許它釋放,這增強了在高並發場景下的請求處理。


技術分享


<IfModule mpm_worker_module>

StartServers 3

ServerLimit 16

MinSpareThreads 25

MaxSpareThreads 75

ThreadsPerChild 25

Maxclients 400

MaxRequestPerChild 1000

</IfModule>


提示;

Apache httpd能更好的為有特殊要求的站點定制。例如,要求 更高伸縮性的站點可以選擇使用線程的MPM,即worker或event;需要可靠性或者與舊軟件兼容的站點可以使用prefork

參考:https://httpd.apache.org/docs/

來源http://www.acbuf.com/ac/311.html

本文出自 “董書豪” 博客,請務必保留此出處http://dongshuhao.blog.51cto.com/13042423/1964283

apache的三種工作模式