Apache负载均衡层无法直接限流,需在入口前置代理层实现:①用mod_qos做IP+路径秒级限频;②用mod_evasive快速封禁恶意IP;③用Lua+Redis实现高精度滑动窗口限流。
apache 本身不支持在负载均衡层(mod_proxy_balancer)直接设置“单 ip 对整个集群的 qps 限流”,但可以通过前置代理层 + 模块组合的方式,在流量进入负载均衡器之前,对客户端 ip 实施访问频率控制。核心思路是:限频必须落在反向代理入口处,而非后端节点或 balancer 内部。
✅ 在负载均衡前统一做 IP 级限频(推荐)
所有请求先经过 Apache 的反向代理逻辑,再由 balancer://mycluster 分发。因此,你应在 <VirtualHost> 或 <Location> 中配置限频规则,作用于整个 upstream 集群入口。
使用 mod_qos 实现路径 + IP 维度的粗粒度限流
mod_qos 是 Apache 生态中唯一支持按 HTTP_HOST、REQUEST_URI 和 REMOTE_ADDR 多条件匹配并计数的成熟模块,适合绑定到负载均衡入口路径:
<IfModule mod_qos.c>
# 全局每 IP 每秒最多 5 个请求(适用于 /api/ 下所有接口)
<Location "/api/">
QS_SrvMaxReqPerSec 100
QS_LocRequestLimit /api/ 5
QS_SrvMaxConnPerIP 8
</Location>
</IfModule>说明:
-
QS_LocRequestLimit /api/ 5:每个 IP 每秒最多发起 5 次/api/开头的请求(非滑动窗口,精度为秒级); -
QS_SrvMaxConnPerIP 8:防连接耗尽,限制单 IP 最多维持 8 个活跃连接; -
QS_SrvMaxReqPerSec 100:整站总配额兜底,防多个 IP 合力打爆后端。
⚠️ 注意:
mod_qos需手动编译安装(如apt install libapache2-mod-qos),且不跨进程共享状态,适合中小流量场景。
✅ 结合 mod_evasive 做快速 IP 封禁(防扫描/暴力)
适用于防御简单爬虫、登录爆破等场景,响应快、配置轻:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<IfModule mod_evasive20.c> DOSHashTableSize 3097 DOSPageCount 3 # 同一页面 2 秒内最多 3 次 DOSPageInterval 2 DOSSiteCount 50 # 全站 5 秒内最多 50 次 DOSSiteInterval 5 DOSBlockingPeriod 60 # 封禁 60 秒 DOSLogDir "/var/log/apache2/evasive" </IfModule>
优势:开箱即用,适合应急防护;
局限:只统计请求次数,不控并发连接,无法区分子域名或用户身份。
✅ 用 Lua + Redis 实现高精度 IP/用户级限流(需开发介入)
若需按 X-API-Key、Authorization 或 X-Forwarded-For 做动态限频(如 API 调用配额),可借助 mod_lua 调用外部 Redis:
LoadModule lua_module modules/mod_lua.so LuaPackagePath "/usr/local/share/lua/5.3/?.lua;;" <Location "/api/"> LuaCodeCache off LuaHookHandler /path/to/rate_limit.lua run </Location>
对应 rate_limit.lua 示例逻辑:
local redis = require "redis"
local client = redis.connect("127.0.0.1", 6379)
local ip = ngx.var.remote_addr
local key = "rate:ip:" .. ip .. ":api"
local count = client:incr(key)
if count == 1 then client:expire(key, 60) end
if count > 30 then
ngx.status = 429
ngx.header["Retry-After"] = "60"
ngx.exit(429)
end适用场景:需要用户维度、滑动窗口、分钟级配额、与业务系统联动的生产环境。
❌ 不推荐的做法
-
在
<Proxy balancer://mycluster>内配置限频:mod_proxy_balancer无请求计数能力,无法实现; -
仅靠
MaxRequestWorkers或mpm_prefork参数控流:这是全局线程池限制,不是频率控制,且误伤正常用户; -
依赖
mod_ratelimit控制接口 QPS:它只限响应带宽(KB/s),不控请求数,与目标无关。
不复杂但容易忽略:限频点一定要设在 ProxyPass 之前,确保所有进来的请求都被检查。只要路径匹配上,无论最终转发到哪台后端,都已受控。

















