Apache不内置IP实时限速算法,需通过mod_ratelimit(基础速率压制)、mod_lua+Redis(滑动窗口精准限速)、mod_evasive(TCP层连接防护)及ProxySet参数(代理链路节流)分层协同实现突发流量平抑。

Apache 本身不内置“按客户端 IP 实时限速”的智能算法,但可通过模块组合 + 外部协同实现对突发异常流量的平抑——核心是分层拦截:在连接建立前控制速率、在请求处理中识别异常、在代理链路中动态调节。关键不是单点配置,而是构建“感知—限速—反馈”闭环。
用 mod_ratelimit 做基础请求速率压制
适合简单场景,如限制单个 IP 每分钟最多 30 个请求,防止爬虫或误配置客户端持续刷量:
- 启用模块:
a2enmod ratelimit(Debian/Ubuntu)或确认LoadModule ratelimit_module modules/mod_ratelimit.so - 在虚拟主机或 Location 中配置:
Ratelimit on<br>RatelimitRequests 30<br>RatelimitInterval 60<br>RatelimitBurst 10
其中RatelimitBurst允许短时突发(如首秒放行 10 个),避免正常用户被误伤 - 注意:该模块仅作用于 HTTP 请求层级,不区分 GET/POST,也不感知后端响应延迟;适用于静态资源或轻量 API 网关前置防护
用 mod_lua + Redis 实现 IP 级滑动窗口精准限速
应对真实业务中的突发流量(如秒杀预热、活动开屏),需支持毫秒级窗口、多维度 Key(IP+User-Agent+API 路径)和自动过期:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 启用
mod_lua和 Redis 客户端(如 lua-resty-redis 或原生 redis-cli 封装) - 在
httpd.conf中嵌入 Lua 脚本逻辑:LuaHookAccessChecker "/path/to/ratelimit.lua" runall - 脚本内做三件事:提取 client IP;构造 Redis Key(如
rate:ip:192.168.1.100:/api/order);调用 INCR + EXPIRE 原子操作,若计数超阈值(如 100 次/10 秒)则返回 429 - 优势:支持动态阈值(从 Redis 读取)、可记录拒绝日志、能与监控系统联动告警
结合 mod_evasive 防突发连接耗尽
针对 TCP 层洪水(如 SYN Flood、慢速攻击),mod_evasive 是更底层的防御补充:
- 安装后启用:
a2enmod evasive,并配置关键参数:
DOSHashTableSize 2048<br>DOSPageCount 2<br>DOSSiteCount 50<br>DOSBlockingPeriod 600<br>DOSLogDir "/var/log/apache2/evasive"
- 含义:同一 IP 1 秒内访问同一页面 ≥2 次,或全站请求 ≥50 次,即封禁 600 秒;它不依赖请求完成,而是在 Apache 接收阶段就拦截,有效防连接队列打满
- 配合系统级防护(如 iptables 自动 DROP)效果更强,但需避免误封 CDN 或 NAT 后用户
通过 Proxy 设置反向代理层节流缓冲
当 Apache 作为网关代理后端服务时,可在 proxy 链路中加入“软限速”,避免突发流量直接冲击下游:
- 使用
ProxySet acquire=2000控制获取后端连接的最大等待时间(毫秒),超时即快速失败,不堆积请求 - 设置
ProxyTimeout 8(而非默认 60),缩短故障节点隔离周期,让流量更快切到健康实例 - 对高风险路径(如
/login)单独配置低权重 + 高 retry 值,配合lbmethod=bybusyness让负载自然分散,避免某节点瞬间过载

















