“Apache MPM worker”的原理與默認設置

該多處理模塊(MPM)綜合了多進程多線程服務器應用。通過使用線程應對服務請求,能在系統資源少的情況下處理大量請求。它通過在每個進程下保持許多線程,仍然保留住了基于流程服務器的穩定性。

控制MPM最重要的指令是“ThreadsPerChild”,通過控制啟動的線程最大數量,控制每個進程和“MaxClients”部署的線程數。

工作原理

單一控制進程(父)負責開始子進程。每個子進程按照“ThreadsPerChild”指令產生固定數量的服務線程,以及一個監聽連接并將它們傳輸到服務線程加工處理的監聽線程。

Apache總是嘗試保持一個備用池或空閑服務器線程,隨時準備應對服務請求。用這種方式,客戶端不需要在請求得到應答之前等待產生新線程或進程。最初啟動的進程數量由“StartServers”指令設定。在操作期間,Apache評估所有進程的閑置線程,然后forks或殺死進程,將數量保持在“MinSpareThreads”和“MaxSpareThreads”限定的范圍內。

由于這一過程的自我調節能量非常強,幾乎沒必要修改這些指令的默認值。同時服務的客戶端由“MaxClients”確定。活躍子進程的最大數量由“MaxClients” 指令除以“ThreadsPerChild”指令決定。

有兩個指令設定活躍子進程數量和子進程里的服務器線程數量,并且只能通過完全停止服務器,然后重新啟動才能改變。“ServerLimit”是活躍子進程的上限,必須大于或等于“MaxClients”指令除以“ThreadsPerChild”指令的值。“ThreadLimit”是服務器線程的上限,必須大于或等于“ThreadsPerChild”指令。如果這些指令沒有定義默認值,它們會在其它其它worker指令之前出現。

控制進程和線程的典型mpm_worker_module配置如下:

ServerLimit 16
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25

盡管Unix下的父進程通常以root開始以便于綁定80端口,但Apache是以較小特權的用戶啟動子進程和線程。User和Group指令用于設定Apache子進程的特權。子進程必須有能力閱讀服務的內容,但除此之外的特權很少。此外,除非使用suexec,這些指令能被CGI腳本傳承。

“MaxRequestsPerChild”控制殺死老進程并啟動新進程的服務器循環過程。