apache prefork 模式通过固定进程数保障稳定性而非节省内存,关键在于实测单进程内存(如24mb)、按公式“maxrequestworkers = 可用内存×0.8 ÷ 实测值”向下取整,并禁用event/worker模块及php-fpm,设maxconnectionsperchild为1000–5000防泄漏。

Apache Prefork 模式不是“省内存”的方案,而是用确定性进程隔离换稳定性——它的内存开销是刚性的,控制关键不在压缩单进程体积,而在精准约束进程总数与生命周期,防止超出物理内存边界。
看准单进程真实内存占用
别依赖理论值(如“每个进程20MB”),必须实测。运行 ps_mem.py 或执行:
- ps -o pid,user,%mem,command -C httpd | sort -k3 -n —— 查看各 httpd 进程实际内存占比
- 取稳定服务时段中位数(非峰值)作为单进程内存基准,例如实测为 24 MB,而非拍脑袋填 15 MB 或 30 MB
核心参数按内存倒推设置
所有参数必须围绕 MaxRequestWorkers × 单进程内存 ≤ 可用物理内存 × 0.8 这条铁律展开(留20%给系统、MySQL、PHP CLI等):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- MaxRequestWorkers:硬上限,等于「可用内存 × 0.8 ÷ 单进程实测内存」向下取整。8GB 内存、实测进程占 24MB → 8×1024×0.8÷24 ≈ 273 → 设为 270
- StartServers:设为 MaxRequestWorkers 的 15%~25%,如 270×0.2≈54 → 取 50,避免冷启动响应延迟
- MinSpareServers / MaxSpareServers:分别设为 StartServers 的 0.8 倍和 1.5 倍,例如 40 和 75,让空闲池弹性缓冲突发流量
- ServerLimit:必须 ≥ MaxRequestWorkers;若需调高 MaxRequestWorkers 超过默认上限(如 256),必须先显式设 ServerLimit ≥ 目标值
关掉干扰项,守住模型一致性
Prefork 的内存可控性,前提是不混搭其他执行模型:
- 确认只启用 mpm_prefork_module,禁用 mpm_event 和 mpm_worker(Debian/Ubuntu 用 a2dismod,CentOS/RHEL 注释掉对应行)
- 只用 mod_php(libphp.so),彻底停用 PHP-FPM 服务,并删除配置中所有 ProxyPassMatch 或 SetHandler proxy:fcgi://
- 检查 httpd -M | grep mpm 输出,确保仅出现 mpm_prefork_module (shared)
防内存缓慢泄漏:必须设 MaxConnectionsPerChild
即使代码无明显泄漏,长期运行的 PHP 进程仍可能因扩展或 Zend 引擎累积碎片。不设该值等于放任内存缓慢爬升:
- 生产环境建议设为 1000–5000(根据日均请求数反推:如日均 200 万请求、4 个活跃进程 → 平均每进程处理 50 万请求 → 设 2000 更稳妥)
- 设为 0 表示永不退出——在 Prefork 下极易引发 OOM Killer 杀进程,不推荐
- 修改后用 apache2ctl configtest 或 httpd -t 验证语法,再 systemctl restart apache2 或 systemctl restart httpd










