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