Apache中用mod_security限频需精准触发:仅对业务接口路径(如/api/login、/search)的GET/POST计数,排除静态资源与健康检查;采用IP+User-Agent或IP+参数哈希组合维度防误杀;计数规则置于phase:1、nolog、pass,拦截返回429;expirevar按场景设10秒或60秒,阈值分别@gt30或@gt5。

在 Apache 中用 mod_security 做请求频率限制,核心不是“检测越密越好”,而是让规则只在关键路径触发、只对可疑行为计数、并避开高并发正常流量——否则规则全量扫描每个请求头/体,CPU 和内存开销会明显上升,反而拖慢服务。
只对特定方法和路径启用计数
默认对所有请求(包括静态资源、健康检查、API探针)都执行 setvar:ip.COUNT=+1,是性能损耗主因。应缩小作用范围:
- 仅对
GET和POST中的业务接口路径计数,例如/api/login、/search - 排除静态资源:
SecRule REQUEST_URI "\.(js|css|png|jpg|woff2)$" "phase:1,nolog,allow,id:900001" - 排除健康检查路径:
SecRule REQUEST_URI "^/health$" "phase:1,nolog,allow,id:900002"
用 IP + URI 组合计数,避免全局误杀
单靠 IP 计数,在 CDN 或 NAT 环境下容易误封大量用户。改用更精细维度:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 对登录接口按 IP + User-Agent 组合计数:
initcol:ip_useragent=%{REMOTE_ADDR}_%{REQUEST_HEADERS.User-Agent} - 对搜索接口按 IP + 查询参数哈希计数(防枚举):
setvar:ip_search=%{REMOTE_ADDR}_@md5(%{ARGS.q}) - 避免对整个站点统一限速(如
DOSSiteCount那类粗粒度方式),它无法区分真实用户刷首页和机器人爆破后台
调低规则执行阶段与日志级别
高频规则若在 phase:2(请求体解析后)运行,需解包 POST 数据;若带 log 或 auditlog,还会写磁盘。优化如下:
- 把计数规则放在
phase:1(请求行和头解析后),不碰请求体 - 禁用匹配日志:
nolog,pass替代log,deny,只在真正触发拦截时记录 - 拦截响应用
status:429而非重定向或自定义页面,减少输出处理
设置合理的过期与阈值,避免内存堆积
expirevar 时间设太长(如 3600 秒),会导致大量临时变量滞留内存;设太短(如 10 秒)又起不到限速效果。建议:
- 秒级防护(防爬虫瞬时打点):用
expirevar:ip.COUNT=10,阈值设为@gt 30 - 分钟级防护(防暴力登录):用
expirevar:ip.COUNT=60,阈值设为@gt 5 - 监控
/var/cache/mod_security目录大小,若持续增长超 50MB,说明变量未及时清理,需检查expirevar是否生效或有规则漏写


















