Apache 的 MPM(prefork/worker/event)该选哪个?
现代环境默认选 event(异步处理 keep-alive,高并发省内存);用 mod_php 等非线程安全模块才退选 prefork;worker 是折中。切换用 a2enmod/a2dismod。本文对比三 MPM 并给出选型。
直接建议:默认选 event——它在 worker 基础上优化了 keep-alive 连接处理,高并发下内存占用最低,是 Apache 2.4 的推荐默认;只有当你用 mod_php 等非线程安全模块时才退回 prefork(PHP 现代化做法是 php-fpm + event,两头都受益);worker 作为折中备选。
三 MPM 对比
| MPM | 模型 | 优点 | 缺点 | 适用 |
|---|---|---|---|---|
| prefork | 多进程、每进程一线程 | 最稳定、兼容非线程安全模块 | 内存大户、并发能力弱 | mod_php、老模块 |
| worker | 多进程多线程 | 折中 | keep-alive 仍占线程 | 中等流量 |
| event | worker + 异步事件 | keep-alive 不占线程、最省内存、并发最强 | 极个别老模块不兼容 | 默认选择 |
查看当前用的哪个
apachectl -V | grep MPM
# 或
httpd -V | grep MPM
切换方法(Debian/Ubuntu)
sudo a2dismod mpm_prefork php8.x # 先卸冲突的(mod_php 与 event 互斥)
sudo a2enmod mpm_event
sudo systemctl restart apache2
RHEL/CentOS 改 /etc/httpd/conf.modules.d/00-mpm.conf 的注释行后重启。
与 PHP 的经典搭配问题
- mod_php 只能配 prefork(PHP 模块非线程安全)
- 想用 event:改用 PHP-FPM——Apache 通过
proxy_fcgi转发,既享受 event 的并发,PHP 进程又独立管理 - 这也是当今 LNMP/LAMP 生产环境的推荐结构
event 的关键参数
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 1000
</IfModule>
MaxRequestWorkers = 进程数 × ThreadsPerChild,按内存预算倒推。
观测云对照
MPM 调整效果用数据验证。 Apache 的 busy workers、QPS、内存占用由 DataKit 采集,切换 MPM 或调参前后的并发承载与资源曲线直接对比,参数调优不再拍脑袋。
常见问题(FAQ)
Q:Nginx 比 Apache event 强在哪?
A:Nginx 全异步架构在纯静态/反代场景仍更省资源;Apache event + php-fpm 的差距已不大,存量 Apache 不必仅为性能迁移。
Q:切换 MPM 会影响现有配置吗?
A:MPM 专属指令块要对应改名(IfModule),虚拟主机配置不受影响;mod_php 站点必须先迁移到 php-fpm。
Q:高并发下 event 也扛不住怎么办?
A:先确认瓶颈(CPU/内存/后端),Apache 前加 Nginx/CDN 卸载静态与慢连接,或水平扩展多机。