prefork mpm并发能力由进程数决定,需验证mpm生效(httpd -v确认prefork)、禁用冲突模块、合理设maxrequestworkers(按内存计算:如8gb÷20mb≈300)、调优startservers等参数,并同步提升ulimit和系统文件描述符限制。

Apache 使用 Prefork MPM 时,并发能力由进程数量直接决定,每个请求独占一个进程,不能靠线程扩容。调高连接数不是改一个参数就行,得看内存、确认模块生效、避开硬编码限制,还要防止系统级资源卡脖子。
先确认你真在用 prefork
别只看配置文件里有没有 mpm_prefork_module,得验证实际加载的模块:
- 运行
httpd -V | grep -i mpm(CentOS/RHEL)或apache2ctl -V | grep -i mpm(Debian/Ubuntu),输出必须是 MPM: prefork - 如果显示 event 或 worker,说明没切成功;Debian/Ubuntu 可执行
a2dismod mpm_event mpm_worker && a2enmod mpm_prefork,再重启 - 检查
httpd -M或apache2ctl -M输出,确保只有mpm_prefork_module (shared),没有其他 MPM 模块共存
Prefork 核心参数怎么设才合理
关键不是“最大能填多少”,而是“服务器撑得住多少”。每个 PHP 进程通常吃 15–25MB 内存,总内存减去系统预留后,再除以单进程开销,就是安全上限:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
MaxRequestWorkers:等价于旧版
MaxClients,是最大并发请求数,也是最大子进程数。设为 400?先算:400 × 20MB = 8GB → 你服务器有 8GB 可用内存吗? - StartServers / MinSpareServers / MaxSpareServers:建议设为相近值(如都设 5~8),避免频繁 fork 和回收,减少抖动
- MaxRequestsPerChild:设为 10000 或 0(不限制),防止长期运行的进程因内存泄漏缓慢退化
示例(8GB 内存、PHP-CGI 环境):
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 300
MaxRequestsPerChild 0
注意那些“改了也白改”的坑
有些环境根本不让你调上去,尤其是集成套件或旧编译版本:
-
phpEnv(Windows):底层 Apache 编译时硬编码
HARD_SERVER_LIMIT=256,就算配置写MaxRequestWorkers 1000,实际生效仍卡在 256 -
某些旧版 Apache 2.2 或定制包:可能未启用
mpm_prefork_module的动态加载,或配置路径不标准(如 FreeBSD 的/usr/local/etc/apache22/extra/httpd-mpm.conf) -
没启用 MPM 配置文件:检查主配置
httpd.conf或apache2.conf中是否启用了Include conf/extra/httpd-mpm.conf(去掉前面的 #)
别忘了系统层的配合
Apache 配得再高,Linux 默认限制也会拦住你:
- 查当前限制:
ulimit -n(用户级),再查 Apache 进程实际值:cat /proc/$(pgrep apache2 | head -1)/limits | grep "Max open files" - 永久提升:在
/etc/security/limits.conf加两行:
www-data soft nofile 65536
www-data hard nofile 65536(Debian/Ubuntu)
或针对apache用户(RHEL/CentOS) - 重启 Apache 前,用
apache2ctl configtest或httpd -t验证语法,避免配错导致服务起不来










