apache本身不直接控制动态应用资源,需协同cgroups、rlimit指令、php-fpm等运行时及mod_qos实现分层限制。

Apache 本身不直接控制动态应用(如 PHP-FPM、Python WSGI 或 CGI 脚本)的 CPU、内存等系统资源占比,但它可以通过分层协同机制配合操作系统级工具实现有效限制。核心思路是:Apache 负责请求接入与分发控制,真实资源约束交由底层运行时或内核机制执行。
1. 用 cgroups 划定 Apache 及其子进程的资源边界
cgroups(v1 或 v2)是最可靠的方式,能对 Apache 主进程及其派生的 CGI/PHP/WSGI 子进程统一限额。适用于 CentOS/RHEL 7+ 和 Debian 10+。
- 创建 memory + cpu 控制组:
sudo cgcreate -g memory,cpu:/apache-limited
echo "512M" | sudo tee /sys/fs/cgroup/memory/apache-limited/memory.limit_in_bytes
echo "50000" | sudo tee /sys/fs/cgroup/cpu/apache-limited/cpu.cfs_quota_us(即限制为 50% CPU) - 将 Apache 主进程加入该组:
sudo cgclassify -g memory,cpu:/apache-limited $(pgrep -f "httpd\|apache2") - 确保子进程自动继承(需在 httpd.conf 中启用
CGEngine on并加载mod_cgroup,或改用 systemd 服务文件中配置MemoryLimit=512M、CPUQuota=50%)
2. 对 CGI/PHP 类动态脚本单独设限
若动态内容通过 CGI 或 mod_php 执行,Apache 可通过 RLimit* 指令限制其子进程资源,仅作用于 exec、SSI 或 CGI 启动的进程:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
RLimitCPU 60 120:软限 60 秒,硬限 120 秒 CPU 时间 -
RLimitMEM 134217728:限制子进程最大内存为 128MB(字节) -
RLimitNPROC 20:限制每个 Apache worker 最多启动 20 个子进程 - 这些指令可放在
<directory></directory>或<location></location>块中,精准作用于特定脚本目录
3. 配合运行时环境做细粒度控制
Apache 是“门卫”,真正跑代码的是外部运行时——应优先在此层设限:
-
PHP-FPM:在
www.conf中设置pm.max_children、rlimit_memory = 256M、process.priority = 10 -
uWSGI:使用
--limit-as 256(MB)、--processes 4、--cpu-affinity 1 -
Node.js(反向代理模式):用
systemd启动时配置MemoryMax=512M、CPUSchedulePolicy=idle
4. 用 mod_qos 实现请求级资源配额分流
当多个动态应用共用同一 Apache 实例时,可用 mod_qos 按路径区分流量并分配权重:
- 为 /api/ 路径设置高优先级和宽松连接数:
QS_SrvMaxConnPerIP 50<location> QS_SrvMinDataRate 1024 120000 </location> - 为 /slow-report/ 设置低带宽保障,防拖垮整站:
<location> QS_SrvMaxConnPerIP 3 QS_SrvMaxConn 10 </location>










