apache 不通过 mod_proxy 实现单 ip 请求频率限制,需用 mod_evasive、mod_qos 或 mod_security:mod_evasive 轻量拦截暴力请求;mod_qos 支持路径级限流与网段区分;mod_security+redis 可实现高精度秒级限频。
apache 本身不通过 mod_proxy 实现单 ip 请求频率限制——mod_proxy 只负责转发,限频必须由其他模块在代理前介入。真正可行的方案是组合使用 mod_evasive、mod_qos 或 mod_security,按 ip 统计并拦截超限请求。
用 mod_evasive 做轻量级 IP 请求频次拦截
适合防御简单暴力请求(如登录爆破、接口扫描),部署快、无需外部依赖:
- 启用模块后,在全局或虚拟主机中配置计数窗口和阈值,例如:
DOSPageCount 5
DOSPageInterval 1
DOSSiteCount 100
DOSSiteInterval 5
DOSBlockingPeriod 600
DOSLogDir "/var/log/apache2/evasive" - 它对同一页面(如
/api/login)每秒最多放行 5 次,整站 5 秒内最多 100 次;超限则封禁该 IP 600 秒,返回 403 - 注意:它默认统计的是「请求次数」,不是并发连接数;也不区分 HTTP 方法或子域名,但可通过
SetEnvIf配合DOS_ENABLED实现仅对特定路径+方法生效
用 mod_qos 实现更精细的 IP 级限流
支持 CIDR 网段匹配、并发连接控制与路径级速率限制,比 mod_evasive 更可控:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 安装后(需手动编译或从第三方源安装),在
<location></location>或<virtualhost></virtualhost>中配置:
QS_SrvMaxConnPerIP 10
QS_Limit 30/60 -
QS_SrvMaxConnPerIP 10:每个 IP 最多维持 10 个活跃连接(防慢速攻击)QS_Limit 30/60:该路径每分钟最多接受 30 次请求(漏桶式,非滑动窗口) - 支持按网段单独设限,例如:
QS_SrvMaxConnPerIP 5 "192.168.10.0/24",对内网段更宽松,对外网更严格
用 mod_security + Redis 实现高精度 IP 计数(推荐生产环境)
当需要秒级窗口、用户级维度或跨进程共享状态时,mod_security 结合外部存储是更可靠的选择:
- 编写 SecRule 规则,在
phase:1中提取真实客户端 IP(注意透传X-Forwarded-For并启用RemoteIPHeader) - 用
setvar写入内存变量,并配合expirevar设置 TTL,例如:
SecRule REMOTE_ADDR "@ipMatch 192.168.0.0/16" "phase:1,pass,setvar:ip_api_count=+1,expirevar:ip_api_count=60" - 再加一条规则检查计数是否超阈值,触发
status:429并返回Retry-After头 - 若需持久化或集群共享,可改用 Lua 脚本调用 Redis(需启用
mod_lua),实现令牌桶或滑动窗口逻辑
不建议仅靠 mod_ratelimit 或 LimitRequestRate 来做 IP 频次控制——前者限的是响应带宽(KB/s),后者限的是单连接内请求解析速率,都不统计 IP 维度的请求数。真正的单 IP 频率防护,必须落在有状态跟踪能力的模块上。










