Apache HTTP Server 版本2.2

| 說明 | 支持混合的多線程多進程的多路處理模塊 |
|---|---|
| 狀態(tài) | MPM |
| 模塊名 | mpm_worker_module |
| 源文件 | worker.c |
此多路處理模塊(MPM)使網(wǎng)絡(luò)服務(wù)器支持混合的多線程多進程。由于使用線程來處理請求,所以可以處理海量請求,而系統(tǒng)資源的開銷小于基于進程的MPM。但是,它也使用了多進程,每個進程又有多個線程,以獲得基于進程的MPM的穩(wěn)定性。
控制這個MPM的最重要的指令是,控制每個子進程允許建立的線程數(shù)的ThreadsPerChild指令,和控制允許建立的總線程數(shù)的MaxClients指令。
每個進程可以擁有的線程數(shù)量是固定的。服務(wù)器會根據(jù)負載情況增加或減少進程數(shù)量。一個單獨的控制進程(父進程)負責(zé)子進程的建立。每個子進程可以建立ThreadsPerChild數(shù)量的服務(wù)線程和一個監(jiān)聽線程,該監(jiān)聽線程監(jiān)聽接入請求并將其傳遞給服務(wù)線程處理和應(yīng)答。
Apache總是試圖維持一個備用(spare)或是空閑的服務(wù)線程池。這樣,客戶端無須等待新線程或新進程的建立即可得到處理。初始化時建立的進程數(shù)量由StartServers指令決定。隨后父進程檢測所有子進程中空閑線程的總數(shù),并新建或結(jié)束子進程使空閑線程的總數(shù)維持在MinSpareThreads和MaxSpareThreads所指定的范圍內(nèi)。由于這個過程是自動調(diào)整的,幾乎沒有必要修改這些指令的缺省值?梢圆⑿刑幚淼目蛻舳说淖畲髷(shù)量取決于MaxClients指令。活動子進程的最大數(shù)量取決于MaxClients除以ThreadsPerChild的值。
有兩個指令設(shè)置了活動子進程數(shù)量和每個子進程中線程數(shù)量的硬限制。要想改變這個硬限制必須完全停止服務(wù)器然后再啟動服務(wù)器(直接重啟是不行的),ServerLimit是活動子進程數(shù)量的硬限制,它必須大于或等于MaxClients除以ThreadsPerChild的值。ThreadLimit是所有服務(wù)線程總數(shù)的硬限制,它必須大于或等于ThreadsPerChild指令。這兩個指令必須出現(xiàn)在其他workerMPM指令的前面。
在設(shè)置的活動子進程數(shù)量之外,還可能有額外的子進程處于"正在中止"的狀態(tài)但是其中至少有一個服務(wù)線程仍然在處理客戶端請求,直到到達MaxClients以致結(jié)束進程,雖然實際數(shù)量會很小。這個行為能夠通過以下禁止特別的子進程中止的方法來避免:
MaxRequestsPerChild設(shè)為"0"MaxSpareThreads和MaxClients設(shè)為相同的值一個典型的針對workerMPM的配置如下:
ServerLimit 16
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
在Unix中,為了能夠綁定80端口,父進程一般都是以root身份啟動,隨后,Apache以較低權(quán)限的用戶建立子進程和線程。User和Group指令用于設(shè)置Apache子進程的權(quán)限。雖然子進程必須對其提供的內(nèi)容擁有讀權(quán)限,但應(yīng)該盡可能給予它較少的特權(quán)。另外,除非使用了suexec ,否則,這些指令設(shè)置的權(quán)限將被CGI腳本所繼承。
MaxRequestsPerChild指令用于控制服務(wù)器建立新進程和結(jié)束舊進程的頻率。