apache的块本身不支持访问频率限制,需依赖mod_evasive、mod_limitipconn或mod_qos等第三方模块实现;前者防单uri暴力刷,后者限并发连接或粗粒度qps,均须与目录路径精准匹配且仅对静态文件生效。

Apache 的 <directory></directory> 块本身不提供原生的“访问频率限制”功能。它负责路径级的访问控制(谁可以进)和行为控制(能做什么),比如 Require ip、Options、AllowOverride 等,但不统计请求次数、不计时、不限速。
真正实现“限制访问频率”,必须借助第三方模块,并在 <directory></directory> 内或其外配合使用。常见且实用的组合如下:
✅ 1. 在 <directory></directory> 中启用 mod_evasive(防单 URI 暴力刷)
适用于:防止同一 IP 在极短时间内反复请求某个静态文件(如 /download/app.zip)
配置位置:可放在 <virtualhost></virtualhost> 内,或全局,但需与目标目录路径匹配
<ifmodule mod_evasive20.c><directory>
# 启用模块作用于此目录下的所有请求
# 注意:DOSPageCount 是按完整 URI 统计的
DOSPageCount 3
DOSPageInterval 1
DOSBlockingPeriod 60
</directory></ifmodule>
⚠️ 关键说明:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
DOSPageCount统计的是 同一 IP + 同一 URI 的请求数(不是整个目录) - 若该目录下有大量不同文件(如
/dl/file1.zip,/dl/file2.zip),需靠DOSSiteCount兜底全站总频次 - 不适用于 PHP 动态生成的下载(如
/dl.php?id=123),因 URI 固定但后端逻辑不同
✅ 2. 在 <directory></directory> 中启用 mod_limitipconn(限并发连接数)
适用于:阻止 IDM、迅雷等工具开多个连接下载同一个大文件
配置示例(作用于下载目录):
<ifmodule mod_limitipconn.c><directory>
MaxConnPerIP 2
# 只对二进制流类型生效(需 Apache 正确识别 MIME)
OnlyIPLimit application/octet-stream
</directory></ifmodule>
✅ 效果:每个 IP 最多维持 2 个到该目录下文件的并发 TCP 连接,超限返回 503 Service Unavailable
✅ 3. 在 <directory></directory> 中启用 mod_qos(支持 Host 头 + 路径的粗粒度限流)
适用于:需要按子域名+目录联合限流(如 dl.example.com/downloads/ 独立限频)
需手动编译加载模块,配置较复杂:
<ifmodule mod_qos.c><directory>
# 每 IP 每秒最多 5 个请求(基于请求开始时间窗口)
QS_SrvMaxConnPerIP 5
# 全局最大连接数保护
QS_SrvMaxConn 200
# 可选:对特定响应类型加强限制
QS_SrvMinDataRate 100000 300
</directory></ifmodule>
? 注意:QS_SrvMaxConnPerIP 是连接数限制,不是严格 QPS;但它对 Keep-Alive 和慢连接更有效。
❌ 不推荐的做法
-
LimitRequestRate:作用于整个连接,不是按目录或 IP,且不区分资源类型,易误伤 -
mod_ratelimit:只做带宽整形,不控频次,也不支持条件触发 - 在
<directory></directory>里写Order/Allow/Deny配合时间戳:Apache 无时间变量,无法实现
? 实际建议(生产环境)
-
优先用
mod_limitipconn控并发(简单、稳定、防多线程) -
叠加
mod_evasive防短时刷屏(如 1 秒 5 次) -
大文件下载场景再加
mod_bw的LargeFileLimit控带宽,避免占满出口 - 所有模块都需确认已加载:
a2enmod(Debian)或检查LoadModule行 - 修改后务必执行:
apachectl configtest && systemctl reload apache2
不复杂但容易忽略:频率限制模块必须和 <directory></directory> 路径精准对应,且 Apache 必须直接服务静态文件(非经 PHP 输出),否则中间层会绕过这些规则。









