apache本身不内置单ip接口频次限制功能,但可通过mod_evasive实现轻量级ip封禁,或结合mod_security、lua+redis达成灵活限流;生产环境更推荐前置nginx/haproxy或云waf承担精细流控。
apache 本身不内置“单 ip 接口频次限制”功能,它不是专门的 api 网关或 waf,无法像 nginx + limit_req 或 haproxy 的 stick-table 那样原生支持请求速率控制。但你可以通过组合模块实现近似效果:用 mod_ratelimit(不推荐)不行,真正可行的是 mod_evasive 或 mod_security + 自定义规则,或更现实的选择——用 apache 做反向代理,把限流逻辑交给后端(如 redis + lua)或前置网关(如 cloudflare、haproxy)。
不过如果你坚持在 Apache 层做轻量级防护,最实用、低侵入的方式是:
启用 mod_evasive 模块做基础 IP 封禁
mod_evasive 是专为 Apache 设计的轻量防刷模块,能按 IP 统计请求频率并临时封禁,适合防御简单爬虫和暴力调用:
- 它基于内存计数(非持久化),不依赖数据库;
- 可配置每秒/每分钟请求数阈值、封禁时长、白名单;
- 不区分路径,但可通过
DOSPageInterval和DOSPageCount针对特定 URI(如/api/)加强防护。
配置示例(需先安装并启用模块):
<ifmodule mod_evasive24.c>
DOSHashTableSize 2997
DOSPageCount 30 # 同一页面60秒内最多30次
DOSSiteCount 100 # 全站60秒内最多100次
DOSPageInterval 60 # 页面级统计窗口(秒)
DOSSiteInterval 60 # 全站统计窗口(秒)
DOSBlockingPeriod 600 # 封禁时长(秒,即10分钟)
DOSLogDir "/var/log/mod_evasive"
DOSWhitelist 127.0.0.1
DOSWhitelist 192.168.1.0/24
</ifmodule>
⚠️ 注意:
DOSPageCount对/api/login和/api/user是分别计数的;若想统一限制所有/api/*路径,可配合SetEnvIf Request_URI "^/api/" api_request+DOSWhitelist逻辑绕过,但 mod_evasive 本身不支持正则匹配路径,所以更稳妥的做法是用DOSSiteCount控制全站总频次,并把静态资源(JS/CSS/图片)分离到 CDN 或独立域名,避免干扰。
结合 mod_headers + mod_setenvif 实现简易路由标记(用于后续分流或日志审计)
虽然不能直接限流,但可以给高频 IP 打标,再配合日志分析或外部脚本自动拉黑:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
# 统计 /api/ 开头的请求,对同一 IP 每分钟超 20 次就设环境变量
SetEnvIf Remote_Addr "(.+)" client_ip=$1
SetEnvIf Request_URI "^/api/" is_api
CustomLog "|/usr/bin/awk '{print $1}' | sort | uniq -c | sort -nr | head -10" combined env=is_api
这更适合监控而非实时拦截,需搭配 cron + awk + iptables 脚本做闭环。
更推荐的生产级做法:不要硬扛,换角色
Apache 擅长处理 HTTP 内容服务与反向代理,但不适合做精细 API 流控。实际项目中建议:
- 把 Apache 当作静态资源服务器或 TLS 终结层;
- 在它前面加一层 HAProxy(七层)或 Nginx(带 limit_req_zone),负责:
limit_req zone=api burst=5 nodelay;- 按
$request_uri或$http_authorization区分接口; - 结合 GeoIP 或 Token 校验做分级限流;
- 或直接上云厂商 WAF(如阿里云WAF、Cloudflare Pro),开箱即用,支持 API 级别规则、Bot 管理、自定义速率策略。
Apache 单靠自身模块很难做到“精准防刷不误伤”,尤其面对真实用户使用代理、NAT 或移动端频繁重连的情况。强行调低阈值反而容易导致登录失败、轮询中断等体验问题。
不复杂但容易忽略。










