MaxRequestWorkers 是 Apache 并发处理的硬上限,设置它的核心目的是防止 Apache 子进程或线程过多耗尽系统内存导致崩溃,而不是直接防止后端 Java 或 PHP 应用内部的内存溢出。
先说结论:该参数是一道内存与并发的平衡阀,需根据物理内存和单进程占用量计算,设低了请求排队,设高了系统 OOM。
- 适合:Apache 自身因并发过高导致系统内存耗尽的场景
- 先做:通过 ps 命令测算单进程 RSS 内存占用,按可用内存比例反推上限
- 再验证:观察 server-status 中 BusyWorkers 是否长期逼近该值且无 503 错误
配置文件路径
不同 Linux 发行版 Apache 配置文件路径有所不同,请先确认您的系统类型,修改前建议备份原配置文件:
- CentOS/RHEL: 通常位于
/etc/httpd/conf.modules.d/00-mpm.conf或/etc/httpd/conf.d/mpm.conf - Ubuntu/Debian: 通常位于
/etc/apache2/mods-available/mpm_prefork.conf或/etc/apache2/mods-available/mpm_event.conf
命令速用版
以下命令用于快速评估当前内存状况和进程占用,帮助计算合理值:
# 查看系统可用内存(单位 MB)
free -m
# 查看 Apache 进程平均内存占用(单位 KB,已处理无进程情况)
ps aux | grep httpd | grep -v grep | awk '{sum+=$6; c++} END {if(c>0) print sum/c " KB"; else print "0 KB"}'
# 查看当前并发 worker 使用情况(需启用 mod_status)
curl http://localhost/server-status?auto | grep -E "BusyWorkers|IdleWorkers"计算与修改配置
1. 测算单进程内存占用
使用 ps 命令查看当前 running 状态的 httpd 进程 RSS 值,取一个中间值作为基准。例如实测单进程占用 32MB。
2. 计算合理上限
公式参考:MaxRequestWorkers ≈ (总物理内存 × 0.7) ÷ 单进程 RSS。预留 30% 内存给系统、数据库及其他服务。例如 16GB 服务器,单进程 32MB,可用约 11GB,计算结果约为 350,建议取整为 300 或 256 以留余量。
3. 修改配置文件
根据使用的 MPM 模块(prefork、worker 或 event)编辑对应配置。注意 MaxRequestWorkers 不能单独修改,需同步调整关联参数:
<IfModule mpm_prefork_module>
ServerLimit 256 # 必须 ≥ MaxRequestWorkers,改此项需重启
MaxRequestWorkers 256 # 核心并发限制
StartServers 8 # 建议设为 MaxRequestWorkers 的 10%-20%
MinSpareServers 8 # 避免扩容慢
MaxSpareServers 16 # 避免白占内存
MaxConnectionsPerChild 10000 # 防止内存泄漏累积
</IfModule>4. 后端匹配检查
如果 Apache 作为反向代理连接 PHP-FPM 或 Tomcat,需确保后端的最大进程/线程数(如 pm.max_children 或 maxThreads)不小于 Apache 的 MaxRequestWorkers,否则请求会卡在后端队列。
5. 重启服务
修改 ServerLimit 后必须重启 Apache 服务才能生效,仅 reload 可能无效。
怎么验证是否生效
1. 访问 Apache 的 server-status 页面,观察 BusyWorkers 数值。如果长期稳定在接近 MaxRequestWorkers 的值,且 Scoreboard 中出现大量 W 或 K 状态,说明可能仍需调优或存在请求堆积。
2. 检查错误日志,确认不再反复出现"server reached MaxRequestWorkers setting"或大量 503 Service Unavailable 错误。
3. 监控系统内存使用率,确保在高负载下物理内存使用不超过 80%,避免频繁交换到磁盘。
常见坑
1. 混淆 Java OOM:调整 Apache 参数无法防止 Tomcat 等 Java 容器的堆内存溢出,那是 JVM 管理范畴。
2. ServerLimit 限制:如果 MaxRequestWorkers 设得比 ServerLimit 大,配置会被截断且可能报错,修改 ServerLimit 后必须重启服务。
3. 忽略后端承载:Apache 放行了请求,但后端 PHP-FPM 或 Tomcat 队列满了,会导致 504 网关超时,需同步调优后端参数。
4. 内存泄漏累积:建议设置 MaxConnectionsPerChild(或 MaxRequestsPerChild),让子进程处理一定数量请求后重启,释放潜在泄漏的内存。