应优先选用 event MPM 模式,它通过事件驱动分离监听与工作线程,提升长连接并发能力;再依内存精算 MaxRequestWorkers 和 ThreadsPerChild,合理设置空闲线程池与进程生命周期,并配合 KeepAlive 及系统级优化。

明确当前使用的 MPM 模式
先确认 Apache 使用的是哪种多处理模块(MPM),因为进程/线程模型完全不同:
- Prefork:纯多进程,每个请求独占一个进程;适合 mod_php 等非线程安全模块,但内存开销大;
- Worker:多进程+多线程,单进程内多个线程处理请求;节省内存,但需确保所有模块线程安全;
- Event:Worker 的增强版,用异步事件驱动管理长连接(如 HTTP Keep-Alive、WebSockets),高并发下更高效。
运行 httpd -V | grep MPM 或查看 httpd.conf 中加载的模块(如 mpm_prefork_module),再决定后续调优方向。
按内存容量合理计算核心参数
以最常用的 Event MPM 为例(推荐用于现代虚拟主机环境):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- ServerLimit 和 MaxRequestWorkers 必须成对设置,且前者 ≥ 后者;
-
MaxRequestWorkers 是最大并发请求数,建议按公式估算:
可用内存(MB) ÷ 单个请求平均内存占用(MB)
通常 Apache 进程(含 PHP-FPM 子进程)在中等负载下约占用 25–40 MB,若服务器有 4 GB 可用内存给 Apache,则建议设为MaxRequestWorkers 100–120; - StartServers、MinSpareThreads、MaxSpareThreads 应匹配业务波峰波谷:例如夜间低流量时保持 10–20 个空闲线程,高峰前预热到 50–80;
- ThreadsPerChild 决定每个子进程创建多少线程,一般设为 25–50;设太高易触发系统线程限制,太低则需频繁 fork 新进程。
为不同虚拟主机设置差异化资源边界
Apache 本身不支持 per-vhost 进程数限制,但可通过以下方式实现逻辑隔离:
- 将高负载站点(如下载站、API 服务)与普通网站分到不同
VirtualHost块,并搭配 mod_proxy_fcgi + PHP-FPM 池分离:为每个站点配置独立的 PHP-FPM pool,限制其pm.max_children,避免一个站耗尽全部 PHP 资源; - 对静态为主的站点,启用
mpm_event+mod_mpm配合KeepAliveTimeout 3–5,减少连接复用开销; - 对动态密集型站点(如 CMS 后台),适当降低
MaxConnectionsPerChild(如设为 1000),加快内存回收,防止长期运行导致内存泄漏累积; - 通过
RLimitMEM和RLimitCPU在VirtualHost内部施加硬性资源上限(需启用mod_rlimit),防止单站失控影响全局。
配合外部机制提升弹性与可观测性
仅靠 Apache 自身参数不够,需联动监控与自动响应:
- 用
mod_status开启服务器状态页(ExtendedStatus On),配合 Prometheus + node_exporter 抓取workers、idle、busy线程数,设置告警阈值(如 busy > 90% 持续 2 分钟); - 对突发流量,可结合
mod_ratelimit或反向代理层(如 Nginx 做前置限流)缓冲压力,避免 Apache 进程池瞬间打满; - 定期执行
apachectl graceful平滑重启,释放老化进程内存,尤其在启用了 OPcache 或长时间运行的模块时效果明显。

















