| 特性 | prefork | worker |
|---|---|---|
| 處理模型 | 多進程、單執行緒 | 多進程、多執行緒 |
| 連線對應 | 一進程處理一連線 | 一執行緒處理一連線 |
| 記憶體佔用 | 較高 | 較低 |
| 穩定性 | 高(進程隔離) | 中(執行緒崩潰影響整進程) |
| 相容性 | 支援非執行緒安全模組 | 需所有模組執行緒安全 |
| 效能 | 單核略高 | 高併發下優勢明顯 |
# 1. 備份原啟動檔
mv /usr/local/apache2/bin/httpd /usr/local/apache2/bin/httpd.prefork
# 2. 切換 worker 二進制檔
mv /usr/local/apache2/bin/httpd.worker /usr/local/apache2/bin/httpd
# 3. 調整 MPM 參數
vi /usr/local/apache2/conf/extra/httpd-mpm.conf
# 4. 重啟
/usr/local/apache2/bin/apachectl restart
<IfModule mpm_prefork_module>
ServerLimit 256
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 256
MaxRequestsPerChild 0
</IfModule>
ServerLimit:MaxClients 上限(預設 256,最大 20000,需置於最前)。MaxClients:同步最大連線數(= 最大進程數)。MaxRequestsPerChild:0=永不回收,非零可防記憶體洩漏並釋放閒置進程。<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
MaxClients = ServerLimit × ThreadsPerChild(預設 16×25=400)。MinSpareThreads/MaxSpareThreads:整體閒置執行緒池控制。ThreadsPerChild:每進程固定執行緒數,啟動時一次建立。cd /usr/sbin
mv httpd httpd.prefork
mv httpd.worker httpd
vi /etc/httpd/conf/httpd.conf # 調整 <IfModule worker.c> 區塊
/etc/init.d/httpd restart
常見錯誤:Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe → 註解 /etc/httpd/conf.d/php.conf 中 LoadModule php5_module 行。
生產環境**優先使用預設 prefork**,除非確認所有模組執行緒安全且記憶體極度受限。PHP 官方亦建議搭配 prefork。