mod_proxy本身不提供限流或削峰能力,仅负责代理转发;需配合mod_ratelimit(仅限响应带宽)、mod_lua+Redis(实现IP/路径级RPM限流)或专用网关(如Kong、APISIX)才能达成分布式限流与削峰。

mod_proxy 本身不提供限流或削峰能力 —— 它只是代理转发模块,必须配合其他模块(如 mod_ratelimit、mod_lua 或外部网关)才能实现分布式限流与削峰。
直接在 mod_proxy 配置里加 Ratelimit 指令是无效的,因为 mod_ratelimit 只作用于静态内容响应体大小(按字节限速),不是按请求数限流,也无法识别后端 API 的请求频次。
下面分三类真实可行的路径说明怎么做、为什么选它、以及最容易错在哪。
用 mod_ratelimit 做「响应带宽限速」而非「API 请求限流」
mod_ratelimit 的 Ratelimit 指令限制的是 HTTP 响应体的传输速率(单位:bytes/second),适用于大文件下载场景,对 JSON API 几乎无意义。
常见错误现象:
- 配置了 Ratelimit 100 后,API 返回 200 OK 但响应延迟高、超时多
- curl -v 显示状态码正常,但前端反复重试,日志里大量 200 + 低吞吐
- 它不拦截请求,只“拖慢”响应发送,后端服务照样被压垮
- 无法区分用户、IP、路径,所有流量一视同仁地“灌水”式限速
- 若后端返回小响应(如
{"code":0}),限速几乎不起作用
用 mod_lua + Redis 实现每 IP 每分钟请求数(RPM)限流
这是 Apache 下最贴近「分布式限流」的原生方案:用 Lua 脚本调用 Redis 计数器,支持跨进程共享状态,能真正拒绝超限请求(HTTP 429)。
关键点:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 必须启用
mod_lua和mod_proxy,且 Lua 脚本需在ProxyPass之前执行(用LocationMatch或ProxySet配合lua-script) - Redis 连接不能放在 Lua 的
handle函数里反复建连,要用redis:connect()+ 连接池或复用全局连接对象 - 计数 key 建议设计为
"rate:ip:{client_ip}:path:{uri}:min:{floor(time/60)}",避免时间窗口漂移 - 注意 Apache 的 MPM 模型:prefork 下 Lua 全局变量不共享,必须依赖外部存储(Redis 是唯一靠谱选择)
示例片段(/etc/apache2/mods-enabled/lua.conf):
LoadModule lua_module modules/mod_lua.so
LuaPackagePath "/usr/local/share/lua/5.3/?.lua;;"
<Location "/api/">
SetHandler lua-script
LuaScript "/var/www/ratelimit.lua"
</Location>脚本中需显式调用 proxy_pass(通过 req:proxy_request() 或返回 307 跳转),否则请求不会走到后端。
把限流逻辑前置到专用网关,Apache 仅做 proxy_pass
生产环境更推荐这条路:让 Apache 专注做 TLS 终结、健康检查、简单路由,把限流、鉴权、熔断等交给专业网关(如 Kong、APISIX、Traefik)。
原因很实际:
-
mod_lua在高并发下性能不如 Go/Rust 编写的网关,单机扛不住万级 QPS - Redis 作为限流存储,在网络抖动或超时时会降级失败,而 APISIX 内置本地 LRU + Redis 双写兜底
- Apache 缺乏动态配置热更新能力,改个限流阈值得 reload 进程,可能触发连接中断
- 削峰(如队列缓冲)Apache 根本做不到;
mod_proxy是同步阻塞模型,没有异步缓冲区
典型部署结构:
用户 → TLS 终结(Apache) → ProxyPass https://kong-gateway/api/ → Kong(限流 + Redis + Prometheus 指标) → 后端 API
为什么不要自己在 httpd.conf 里硬编码限流逻辑
有人试图用 <If "%{REMOTE_ADDR} == '192.168.1.100'"> 配合 Deny from 做白名单限流,这属于严重误用:
-
Deny是访问控制,不是限流;它不统计频次,只做静态规则匹配 - 无法实现“每分钟最多 100 次”,只能做到“禁止该 IP”或“允许该 IP”,开关粒度太粗
- 规则加载在启动时解析,无法运行时调整,也不支持滑动窗口、令牌桶等算法
- Apache 的表达式引擎不支持时间函数(如
time())参与计算,没法做窗口判断
真正需要分布式限流时,Apache 就不该是决策节点 —— 它可以是流量通道,但不应该是策略中心。

















