apache的mpm是不可卸载的核心模块,编译时静态链接、运行时唯一存在;prefork为纯进程模型,稳定但内存高;worker为进程-线程混合模型,资源利用率高但需线程安全;event为事件驱动模型,专优长连接,https下不支持。

Apache 的核心并发能力由 Multi-Processing Module(MPM)决定,它不是普通插件,而是服务器运行的底层骨架——控制端口监听、连接接收、子进程/线程创建与请求分发。选错 MPM,再好的配置也难突破性能瓶颈。
MPM 是什么,为什么必须且只能有一个
MPM 是 Apache 2.0 引入的不可卸载核心模块,负责最基础的请求调度逻辑。它在编译阶段就静态链接进 httpd 二进制文件,运行时无法动态切换或共存多个。这是因为不同 MPM 对内存模型、信号处理、锁机制的设计完全不同:prefork 依赖进程隔离,worker 依赖线程共享内存,event 则引入异步事件循环。混用会导致未定义行为甚至崩溃。
常见确认方式:
- 执行 httpd -V | grep MPM 查看编译时选定的 MPM
- 运行 httpd -M | grep mpm 查看当前加载的 MPM 模块名(如 mpm_prefork_module)
- Windows 系统默认固定使用 mpm_winnt,不提供选择
Prefork、Worker、Event 三种模式的关键差异
三者本质是应对不同负载特性的设计取舍:
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
- Prefork:纯多进程,每个进程只服务一个连接。无共享内存,崩溃互不影响,兼容所有非线程安全模块(如传统 mod_php)。适合低并发、高稳定性要求场景,但内存占用随并发线性增长
- Worker:多进程 + 多线程混合。每个进程内含多个线程,线程共享进程内存(如代码段、PHP 解释器),显著节省内存。需确保所有加载模块线程安全
- Event:基于 Worker 改进的事件驱动模型。主线程专责监听和调度,工作线程专注处理活跃连接,对长连接(如 HTTP Keep-Alive、WebSocket)支持更高效。是当前高并发推荐首选
如何根据实际需求选型
选型不能只看“最新”或“最火”,要结合运行环境与业务特征:
- 运行旧版 PHP(
- 已迁移到 PHP-FPM 或使用线程安全扩展(如 PHP 7.4+ ZTS 版本),可直接上 event
- 系统为 CentOS/RHEL 7+ 或 Ubuntu 18.04+,内核支持 epoll,event 性能优势明显
- 站点含大量静态小文件 + 高并发短连接,worker/event 均可;若同时存在较多 CGI 脚本或非标准模块,prefork 更稳妥
关键配置参数的实际含义
MPM 配置通常位于 httpd-mpm.conf 或主配置中以
- StartServers:启动时预创建的子进程数,影响冷启动响应速度
- MinSpareThreads / MaxSpareThreads(worker/event):空闲线程上下限,过低会频繁创建销毁,过高浪费内存
- MaxRequestWorkers:同一时刻最大并发处理请求数,等于 prefork 的进程数上限,或 worker/event 的线程总数上限
- ThreadsPerChild:每个子进程创建的线程数,worker/event 必配,直接影响进程与线程比例
- MaxConnectionsPerChild:子进程处理多少请求后退出,用于缓解内存泄漏累积
配置不合理会导致资源耗尽或连接被拒绝,建议根据服务器内存、CPU 核心数与平均请求内存占用综合计算。










