apache不支持开箱即用的接口级qps限流,需组合mod_ratelimit(目录级)、mod_qos(host/路径级)、lua+redis(ip/用户级)实现粗粒度控制,生产环境推荐交由apisix或nginx等专业网关处理。

Apache 本身不提供开箱即用的、按接口路径或子域名粒度的精确 QPS 限流能力,但可以通过组合模块与策略,在反向代理层实现有效的后端接口调用频率控制。关键不是“拦截每个请求算数”,而是让 Apache 在流量入口处做粗粒度压制 + 状态感知,把真正精细的限流交给上游网关或后端服务更合适。
用 mod_ratelimit 做简单请求速率限制
mod_ratelimit 是 Apache 官方模块,适合对整个 Location 或目录做基础速率封顶,单位是「每分钟请求数」:
- 启用后,在 VirtualHost 或 Location 块中配置:
Ratelimit on
RatelimitRequests 120
RatelimitInterval 60 - 它不区分 IP 或用户,所有访问该路径的请求共享同一计数器
- 适用于内部管理接口、低频文档 API 等场景,不适合高并发或需用户级隔离的业务接口
用 mod_qos 实现 Host+路径级粗粒度限流
mod_qos 支持基于 HTTP Host 头和 URL 路径匹配规则,是 Apache 原生生态中最接近“子域名/接口级限流”的方案(需手动编译加载):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在对应 VirtualHost 中写:
QS_SrvMaxReqPerSec 50
QS_LocRequestLimit /v1/orders 10 - QS_SrvMaxReqPerSec 是全站总配额;QS_LocRequestLimit 才能绑定到具体接口路径
- 注意:它不支持滑动窗口或令牌桶算法,计数精度为秒级,且无法跨进程共享状态
用 Lua + Redis 实现灵活的 IP/用户级限流
若需按 client IP、API key 或 user_id 维度控制,可借助 mod_lua 调用外部 Redis 计数器:
- 启用 mod_lua 后,编写 Lua 脚本读取请求头中的标识,调用 redis.incr + expire 设置 TTL
- 返回 429 Too Many Requests 并带 Retry-After 头,前端可据此退避
- 示例逻辑:
local ip = ngx.var.remote_addr
local key = "rate:" .. ip .. ":/api/v1/search"
local count = redis:incr(key)
if count == 1 then redis:expire(key, 60) end
if count > 30 then ngx.exit(429) end
把限流交给专业网关更可靠
生产环境强烈建议 Apache 仅作轻量反向代理,将限流职责移交 APISIX、Nginx 或 Envoy:
- APISIX 内置 limit-count 插件,支持 Redis 共享计数、动态规则热更新、多维度 key(如 remote_addr + path + app_id)
- Nginx 的 limit_req_zone + limit_req 可配置漏桶/突发容量,性能远超 Apache 模块
- Apache 若强行承担核心限流,会增加 CPU 和内存压力,且故障排查链路变长










