如何设置 Apache 最大连接数 MaxRequestWorkers 防止内存溢出

文章导读
MaxRequestWorkers 是 Apache 并发处理的硬上限,设置它的核心目的是防止 Apache 子进程或线程过多耗尽系统内存导致崩溃,而不是直接防止后端 Java 或 PHP 应用内部的内存溢出。
📋 目录
  1. A 配置文件路径
  2. B 命令速用版
  3. C 计算与修改配置
  4. D 怎么验证是否生效
  5. E 常见坑
A A

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 以留余量。

如何设置 Apache 最大连接数 MaxRequestWorkers 防止内存溢出

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 可能无效。

如何设置 Apache 最大连接数 MaxRequestWorkers 防止内存溢出

怎么验证是否生效

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),让子进程处理一定数量请求后重启,释放潜在泄漏的内存。