MPM是Apache的核心调度中枢,决定进程/线程创建、端口监听与请求分发,不可卸载且同一时间仅能启用一种;其下分prefork(纯多进程)、worker(多进程多线程)和event(事件驱动,2.4+默认推荐)三类,分别适配兼容性、中等并发与高并发长连接场景。

Apache 的核心运行机制围绕 MPM(多处理模块)展开,它不是普通功能模块,而是整个请求生命周期的调度中枢。MPM 决定服务器如何创建进程/线程、监听端口、分发连接,并把控制权交还给上层模块链处理具体请求。其他所有模块(如 mod_rewrite、mod_ssl、mod_php)都运行在 MPM 建立的执行环境之上,依赖其提供的资源隔离与调度能力。
MPM 是 Apache 的底层执行容器
MPM 不可卸载,且同一时间只能启用一种。它位于 Apache 架构最底层,直接对接操作系统 API:
- Prefork:纯多进程,每个子进程单线程,独立内存空间,崩溃互不影响,兼容所有传统模块(如 mod_php)
- Worker:多进程 + 多线程,每个子进程含多个共享内存的线程,内存开销低,但要求所用模块线程安全
- Event(2.4+ 默认推荐):Worker 的增强版,引入专用事件管理线程,高效复用 keep-alive 连接,避免线程空等
模块如何在 MPM 环境中协作
MPM 启动后,会创建一组工作单元(进程或线程),每个单元在收到客户端请求时,按固定顺序调用注册的模块钩子(hooks):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 请求解析阶段:mpm 调用 ap_read_request,触发协议模块(如 http_core)解析 HTTP 头
- 路径映射阶段:调用 translate_name 钩子,由 mod_alias 或虚拟主机配置决定 DocumentRoot
- 认证授权阶段:依次调用 auth 模块的 check_user_id 和 auth_checker
- 内容生成阶段:最终由内容模块(如 mod_php、mod_cgi 或静态文件处理器)生成响应体
整个过程由 MPM 提供的上下文(request_rec 结构体)贯穿始终,确保各模块操作的是同一个请求实例。
配置与加载的关键区别
MPM 的启用方式与其他模块完全不同:
- Apache 2.2:MPM 必须编译时指定(--with-mpm=prefork),rpm 包提供多个二进制(httpd、httpd.worker、httpd.event)
- Apache 2.4:MPM 以动态模块形式存在,通过 /etc/httpd/conf.modules.d/00-mpm.conf 启用,其余 MPM 模块被注释
- 确认当前生效的 MPM:httpd -V | grep MPM 或 httpd -M | grep mpm
- 切换后必须重启服务,不能热重载
选择 MPM 的实际依据
没有“最好”的 MPM,只有更匹配当前场景的选项:
- 跑 PHP(非 ZTS 编译)或依赖老旧 C 扩展 → 选 prefork,规避线程安全风险
- 高并发静态资源服务,内存有限 → 优先 event,尤其在长连接较多时优势明显
- 混合动静态内容,且已验证所有模块线程安全 → worker 是折中选择
- 系统默认值不等于最优解:CentOS 7 默认 prefork,CentOS 8+ 默认 event,需按负载实测调整

















