Apache 的 MPM(prefork/worker/event)该选哪个?

现代环境默认选 event(异步处理 keep-alive,高并发省内存);用 mod_php 等非线程安全模块才退选 prefork;worker 是折中。切换用 a2enmod/a2dismod。本文对比三 MPM 并给出选型。

最佳实践
Apache 的 MPM(prefork/worker/event)该选哪个?封面

直接建议:默认选 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 卸载静态与慢连接,或水平扩展多机。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台