应精准限制Apache中特定路径的并发频率,仅对业务接口如/api/login等启用计数,排除静态资源与健康检查;采用IP+User-Agent或IP+参数哈希等组合维度防误杀;计数与拦截分离,计数在phase:1执行且nolog,拦截单独判断阈值返回429;合理设置expirevar与时限避免内存堆积。

要限制 Apache 中特定路径的请求并发频率,关键不是“全局限速”,而是让规则只在目标路径上触发、只对真实业务请求计数、并避开静态资源和健康检查等干扰流量。否则规则扫描所有请求头或体,CPU 和内存开销会明显上升,反而拖慢服务。
只对业务接口路径启用计数规则
不建议对所有请求统一限频。应精准匹配你要保护的路径,例如 /api/login、/search、/vote/submit 等:
- 排除静态资源:
SecRule REQUEST_URI "\.(js|css|png|jpg|woff2)$" "phase:1,nolog,allow,id:900001" - 排除健康检查:
SecRule REQUEST_URI "^/health$" "phase:1,nolog,allow,id:900002" - 只对目标路径 + 方法计数:
SecRule REQUEST_METHOD "@streq POST" "chain,phase:1,nolog,pass,id:900003"
SecRule REQUEST_URI "^/api/login$" "setvar:ip.login_count=+1,expirevar:ip.login_count=60"
用组合维度防误杀,避免单 IP 一刀切
在 CDN 或 NAT 环境下,纯靠 REMOTE_ADDR 计数容易误封。推荐按场景选择更精细维度:
- 登录类接口:用
IP + User-Agent组合(防同一网络下多设备误伤)
initcol:ip_ua=%{REMOTE_ADDR}_%{REQUEST_HEADERS.User-Agent}
setvar:ip_ua.login_count=+1,expirevar:ip_ua.login_count=60 - 搜索类接口:用
IP + 参数哈希(防关键词枚举)
setvar:ip_search=%{REMOTE_ADDR}_@md5(%{ARGS.q})
setvar:ip_search.count=+1,expirevar:ip_search.count=10
把计数和拦截拆开,降低性能损耗
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 计数规则放在
phase:1(仅解析请求行和头),不碰请求体,禁用日志:nolog,pass - 拦截动作单独写,用
SecRule判断阈值后返回429 Too Many Requests:
SecRule ip.login_count "@gt 5" "phase:1,nolog,deny,status:429,id:900004" - 不要用
log,deny或重定向页面,减少磁盘写入和响应体生成
设置合理过期时间与阈值
- 秒级防护(如防爬虫瞬时打点):
expirevar:ip.count=10,阈值@gt 30 - 分钟级防护(如防暴力登录):
expirevar:ip.count=60,阈值@gt 5 - 避免
expirevar设太长(如 3600 秒),否则变量堆积导致内存持续增长;可监控/var/cache/mod_security目录大小,超 50MB 就需排查是否清理失效
不复杂但容易忽略

















