Apache 无 AsyncMPM,实际支持 event MPM;它通过分离监听、空闲连接管理与请求处理实现高效长连接支持,需合理配置 ThreadsPerChild、MaxRequestWorkers 等参数,并与 Java 非阻塞 I/O 协同优化。

Apache HTTP Server 本身并不提供名为 AsyncMPM 的 MPM(Multi-Processing Module)。这是一个常见的误解——AsyncMPM 并不存在于 Apache 官方版本中。Apache 当前支持的 MPM 主要有三种:prefork、worker 和 event。其中,event MPM 是 Apache 中专为优化长连接(如 HTTP/1.1 持久连接、WebSocket、HTTP/2 流)而设计的现代 MPM,它才是你实际想了解的“异步处理长连接”的核心机制。
event MPM 的工作原理:分离连接管理与请求处理
event MPM 的关键设计是将“监听连接”、“保持空闲连接”和“处理请求”三类任务解耦:
- 主线程(listener thread) 负责 accept 新连接,并将已建立的 socket 分发给工作线程;
- 工作线程(worker threads) 只在有真实请求需要解析、执行或响应时才被占用;
- 空闲长连接(如 Keep-Alive 等待后续请求)由专门的“连接管理器”维护,不长期占用工作线程,极大减少线程开销。
这使得 event MPM 在高并发、大量空闲长连接场景下,内存与线程资源利用率远高于 prefork 或 worker。
长连接下的关键资源配置参数
要让 event MPM 高效支撑长连接,需合理配置以下核心参数(位于 httpd.conf 或 mpm_event.conf):
立即学习“Java免费学习笔记(深入)”;
- ThreadsPerChild:每个子进程创建的工作线程数。建议设为 25–100,取决于 CPU 核心数与应用 I/O 特性;
- MaxRequestWorkers:全局最大并发工作线程总数(= ServerLimit × ThreadsPerChild)。它决定了最多能同时处理多少个活跃请求,而非连接数;
- MaxConnectionsPerChild:子进程处理多少连接后重启(防内存泄漏),对长连接影响较小,可设为 0(不限制);
- KeepAliveTimeout:服务器等待同一连接上新请求的最长时间(秒)。值过大会延长空闲连接驻留时间,但不会额外消耗线程;建议 5–15 秒;
- MaxKeepAliveRequests:单个 Keep-Alive 连接允许的最大请求数。设为 0 表示无限制,适合高频短请求复用;
Java 应用与 Apache event MPM 的协同要点
Apache 通常作为反向代理(配合 mod_proxy 或 mod_proxy_http)将请求转发至后端 Java 应用(如 Tomcat、Jetty)。此时资源分配逻辑分两层:
- Apache 层:event MPM 管理前端客户端连接,轻量维持数千空闲长连接;
- Java 应用层:需匹配启用非阻塞 I/O(如 Tomcat 的 NIO/NIO2 connector 或 Jetty 的 SelectChannelConnector),避免一个长连接独占一个线程;
- 代理配置建议:启用 ProxySet keepalive=On 和 ProxySet timeout=5,使 Apache 复用到后端的连接,并快速释放异常后端连接;
- 注意超时对齐:Apache 的 ProxyTimeout、后端 Java server 的 connection timeout、read timeout 应合理阶梯设置(如 Apache > 后端),防止连接状态错乱。
监控与调优验证方法
确认 event MPM 是否真正高效服务长连接,不能只看并发数,而要看线程实际负载:
- 使用 server-status?auto 查看当前 BusyServers / IdleServers 和 CPULoad,重点观察 Total Accesses 与 Bytes 增长是否平稳;
- 通过 mod_status 的 S 列识别连接状态:"W"(Sending Reply)、"K"(Keep Alive)表示健康长连接,“_”(Open slot)表示空闲线程;
- 用 jstack 或 VisualVM 观察 Java 后端线程池是否出现大量 WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject,提示后端成为瓶颈而非 Apache;










