| 特性 | Prefork (預派生多進程) | Worker (多進程+多線程) | Event (事件驅動線程) |
|---|---|---|---|
| 處理單元 | 單進程單線程 | 多進程,每進程多線程 | 多進程,每進程多線程(主線程只負責分發) |
| 連接模型 | 一進程一連接 | 一線程一連接 | 一線程處理多連接(Keep-Alive 由專用線程管理) |
| 記憶體佔用 | 高(進程隔離,各自複製地址空間) | 中(線程共享進程內存) | 低(線程複用,非阻塞 I/O) |
| 穩定性 | 極高(進程崩潰不影響其他) | 良好(線程崩潰可能拖垮進程) | 良好(同 Worker) |
| 適用場景 | 非線程安全模組(如舊版 PHP mod_php)、需絕對隔離 | 高併發靜態/動態混合、線程安全應用 | 極高併發、長連接(WebSocket、Comet)、現代 Web |
| 預設狀態 | Apache 2.4 前預設 | 2.4 起常見預設 | 2.4 推薦用於生產 |
StartServers 5 # 啟動時預創建子進程數
MinSpareServers 5 # 最小空閒進程數
MaxSpareServers 10 # 最大空閒進程數(超過則 kill)
MaxRequestWorkers 256 # 最大同時客戶端連接數(即最大子進程數)
MaxConnectionsPerChild 0 # 子進程處理請求上限(0=無限,建議設 10000 防記憶體洩漏)
擴容邏輯:空閒不足時按指數級擴容(1→2→4→8…最多 32/秒),直到滿足 MinSpareServers。
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestWorkers 400 # 總線程上限 = ServerLimit * ThreadsPerChild
ServerLimit 16 # 最大進程數上限(需配合 MaxRequestWorkers 調整)
父進程動態調整子進程數,使總空閒線程數維持在 MinSpareThreads~MaxSpareThreads 區間。
mod_php)? → Preforkapache2-mpm-event)。php-fpm (FastCGI) 而非 mod_php。ServerLimit、ThreadLimit 等硬性上限參數時需重啟 Apache。Prefork 以進程隔離換取最高穩定性,適合傳統應用;Worker/Event 以線程共享提升吞吐,Event 更針對 Keep-Alive 優化。現代 Web 應用建議採用 Event + php-fpm 架構,兼顧效能與穩定。