Prefork模式是解决NTS PHP扩展崩溃的关键解法,需验证MPM生效、禁用冲突模块、仅配mod_php、调优StartServers/MaxRequestWorkers等参数防OOM。

要让 Apache 在老系统或非线程安全(NTS)PHP 环境下稳定运行,Prefork 模式不是备选方案,而是关键解法——它用进程隔离代替线程共享,天然规避扩展崩溃、内存踩踏和请求串扰问题。不改代码、不换 PHP 版本,靠配置就能守住服务底线。
确认并强制启用 Prefork MPM
别只看配置文件是否写了 mpm_prefork_module,得验证当前真实生效的模块:
- 在终端执行
httpd -V(CentOS/RHEL)或apache2ctl -V(Debian/Ubuntu),查找输出中 MPM: prefork 这一行 - 若显示
event或worker,说明尚未切换成功 - Debian/Ubuntu:依次运行
a2dismod mpm_event、a2dismod mpm_worker、a2enmod mpm_prefork,再重启systemctl restart apache2 - CentOS/RHEL:编辑
/etc/httpd/conf.modules.d/00-mpm.conf,注释掉mpm_event_module和mpm_worker_module行,取消mpm_prefork_module前的注释
杜绝多 MPM 共存冲突
Apache 不允许多个 MPM 同时加载,但配置残留常导致“看似启用了 Prefork,实则被覆盖”:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 运行
apache2ctl -M | grep mpm(Debian)或httpd -M | grep mpm(CentOS),输出应仅含 mpm_prefork_module (shared) - 若同时出现
mpm_event_module或mpm_worker_module,说明禁用未生效 - 检查
/etc/apache2/mods-enabled/(Debian)或/etc/httpd/conf.modules.d/(CentOS)下是否有残留符号链接或未注释模块行 - 重启前务必用
apache2ctl configtest或httpd -t验证语法正确性
适配 PHP 运行方式:只走 mod_php,禁用 PHP-FPM
Prefork 是为 mod_php 设计的安全底座,混搭 PHP-FPM 反而破坏模型一致性:
- 确保已加载
libphp.so(路径如/usr/lib/apache2/modules/libphp.so或/usr/lib64/httpd/modules/libphp.so) - 主配置或虚拟主机中添加:
AddHandler php-script .php<FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch> - 彻底停用 PHP-FPM 服务:
systemctl stop php*-fpm并systemctl disable php*-fpm - 检查
ProxyPassMatch或SetHandler "proxy:fcgi://..."是否残留,有则删除
Prefork 核心参数调优(以 8GB 内存服务器为例)
参数不是越大越好,核心是让 MaxRequestWorkers × 单进程内存 ≤ 可用物理内存:
-
StartServers 5:启动即建 5 个子进程,适合中小流量 -
MinSpareServers 5与MaxSpareServers 10:空闲进程维持在该区间,避免频繁 fork -
MaxRequestWorkers 400:最大并发请求数,按每个 PHP 进程占约 20MB 估算,400 × 20MB ≈ 8GB,留出系统余量 -
ServerLimit 400:必须 ≥MaxRequestWorkers,否则后者无效 -
MaxRequestsPerChild 4000:防内存缓慢泄漏,设为非零值(0 表示永不清退)
调整后用 ab -n 2000 -c 200 http://localhost/ 对比压测,观察错误率与平均响应时间变化。

















