Apache Prefork MPM通过限制MaxRequestWorkers、设置MaxConnectionsPerChild、禁用KeepAlive及优化Proxy参数来控制内存,避免OOM并保障Java后端代理稳定性。
apache 在 prefork mpm(multi-processing module)模式下使用的是多进程、单线程模型,每个子进程处理一个连接,不共享内存空间。java 应用本身并不运行在 apache 进程中,而是通常通过反向代理(如 mod_proxy)与后端 java 容器(tomcat、jetty 等)通信。因此,“apache 在 prefork 架构下的内存管理”实际关注的是:如何让 apache 作为前端 web 服务器,在高并发场景下合理分配和限制自身内存占用,避免因子进程过多导致系统 oom,同时保障对 java 后端的稳定代理能力。
理解 Prefork 的内存开销来源
Prefork 模式下,每个子进程都是独立的 Apache 实例,其内存消耗主要来自:
- Apache 自身代码段和全局数据结构(相对固定,约 1–3 MB/进程)
- 加载的模块(如 mod_ssl、mod_proxy、mod_rewrite)——启用越多,常驻内存越高
- 每个请求的栈空间、临时缓冲区(如 request body、proxy buffer)、SSL 会话缓存等(动态增长,受 KeepAlive 和超时参数影响显著)
- 未及时释放的资源(如长连接未关闭、ProxyPass 中未配置超时)会导致进程长时间驻留并累积内存
关键参数调优以控制内存总量
核心思路是:限制最大并发进程数,并缩短进程生命周期,避免内存持续堆积。需重点调整以下参数(位于 httpd.conf 或 mpm_prefork.conf):
- StartServers:启动时创建的子进程数,设为 2–5 即可,避免冷启动瞬间内存飙升
- MinSpareServers / MaxSpareServers:空闲进程维持在 5–10 个区间,过大会浪费内存,过小会导致频繁 fork
-
MaxRequestWorkers(旧版叫 MaxClients):最关键参数,直接决定最大并发连接数,也约等于最大内存占用上限。计算公式:
MaxRequestWorkers ≤ 总可用物理内存 × 0.7 ÷ 平均进程 RSS(建议实测 8–12 MB/进程)
例如:8 GB 内存服务器,按 10 MB/进程估算,建议设为 500–600 - MaxConnectionsPerChild(旧版 MaxRequestsPerChild):设为 5000–10000,强制进程处理一定请求数后退出,释放可能泄漏的内存
代理 Java 后端时的内存协同优化
Apache 作为反向代理时,不当配置会让内存压力倍增。需配合 Java 容器行为做针对性设置:
- 禁用或严格限制 KeepAlive On:Prefork 下每个 KeepAlive 连接独占一个进程,长连接会锁住内存。建议设为 KeepAlive Off,或若必须开启,将 KeepAliveTimeout 控制在 2–5 秒,MaxKeepAliveRequests 设为 50–100
- 为 Proxy 模块配置缓冲与超时:
ProxyBuffers 8 64k(限制缓冲区总大小)ProxySet timeout=30 retry=5(避免后端卡顿时进程长期挂起)ProxyBadHeader Ignore(防止异常响应头引发解析问题和内存滞留) - 关闭不必要的模块:用
httpd -M检查已加载模块,禁用如 mod_php、mod_perl 等与 Java 无关的重量级模块
监控与验证是否生效
调优后必须验证实际内存表现:
立即学习“Java免费学习笔记(深入)”;
- 用
ps aux --sort=-%mem | head -20查看 httpd 进程 RSS 占用,确认单进程是否稳定在预估范围内(如 8–12 MB) - 用
httpd -V | grep -i mpm确认当前启用的是 prefork - 通过
ab或wrk模拟并发请求,观察free -h和top中内存变化趋势,检查是否出现持续增长或无法回收 - 启用 mod_status(需配置 Location /server-status),访问
http://yourhost/server-status?auto可实时查看空闲/忙碌进程数、平均请求处理时间等关键指标










