apache本身不支持细粒度防刷流控,但可通过mod_evasive实现ip级限流并豁免白名单,或结合mod_security按user-agent、参数等做精准白名单放行与未匹配流量的速率限制,生产环境建议分层防护,apache仅作轻量守门。

Apache 本身不内置细粒度的防刷流控能力,但可以通过 mod_evasive 或 mod_security + GeoIP/自定义规则 组合实现“精准白名单+流控”的效果。关键不是“只放行白名单”,而是“对非白名单 IP 实施严格限流”,这才是生产中真正可行且安全的做法。
一、用 mod_evasive 实现基础 IP 级流控(含白名单豁免)
mod_evasive 是轻量级模块,适合防御简单 CC 攻击,支持白名单跳过检测:
- 安装:Ubuntu/Debian 执行
sudo a2enmod evasive;CentOS 使用yum install mod_evasive或编译安装 - 配置示例(写入
/etc/apache2/mods-enabled/evasive.conf):
<ifmodule mod_evasive24.c>
DOSHashTableSize 3097
DOSPageCount 2 # 同一页面 1 秒内最多请求 2 次
DOSSiteCount 50 # 全站 1 秒内最多请求 50 次
DOSPageInterval 1 # 页面计数窗口:1 秒
DOSSiteInterval 1 # 全站计数窗口:1 秒
DOSBlockingPeriod 600 # 触发后封禁 600 秒
DOSWhitelist 192.168.1.0/24
DOSWhitelist 2001:db8::/32
DOSWhitelist 127.0.0.1
</ifmodule>注意:DOSWhitelist 中的 IP 或网段完全绕过所有计数和封禁逻辑,适合运维、监控、可信 CDN 回源地址。
二、用 mod_security + 自定义规则做参数级精准控制
当需要按 User-Agent、Referer、请求路径、甚至特定 query 参数(如 ?token=xxx)做白名单,并对其他流量限流时,mod_security 更合适:
- 启用 mod_security 和 CRS(Core Rule Set),确保
SecRuleEngine On - 添加白名单规则(优先匹配,跳过后续限流):
SecRule REMOTE_ADDR "@ipMatch 192.168.10.5,2001:db8::1" "id:1001,phase:1,pass,nolog,ctl:ruleEngine=Off" SecRule REQUEST_HEADERS:User-Agent "@contains Trusted-Monitor-Bot" "id:1002,phase:1,pass,nolog,ctl:ruleEngine=Off" SecRule ARGS:api_key "@streq abc123def456" "id:1003,phase:2,pass,nolog,ctl:ruleEngine=Off"
- 再叠加速率限制规则(仅作用于未被白名单放过的请求):
SecAction "id:2001,phase:1,initcol:ip=%{REMOTE_ADDR},pass,nolog"
SecRule IP:counter "@gt 100" "id:2002,phase:1,deny,status:429,msg:'IP rate limit exceeded',setvar:ip.counter=+1"
SecRule &IP:counter "@eq 0" "id:2003,phase:1,pass,setvar:ip.counter=1,nolog"
SecRule IP:counter "!@eq 0" "id:2004,phase:1,pass,setvar:ip.counter=+1,expirevar:ip.counter=60,nolog"这段逻辑表示:每 IP 每分钟最多 100 次请求,超限返回 429;白名单请求不进入该计数流程。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
三、结合 Apache 的 rewrite + env 做动态流控开关
适用于需按域名、路径或 Header 动态启用/禁用限流的场景(比如只对 /api/v1/submit 限流,且排除内部调用):
- 先用
RewriteCond标记白名单流量:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^10\.10\.10\.10$
RewriteCond %{HTTP:X-Forwarded-For} ^10\.10\.10\.10$
RewriteRule ^ - [E=WHITELISTED:1]
<p>RewriteCond %{REQUEST_URI} ^/api/v1/submit
RewriteCond %{ENV:WHITELISTED} !=1
RewriteRule ^ - [E=NEEDS_RATE_LIMIT:1]</p>- 再用
LimitRequestFields或第三方模块(如mod_ratelimit)配合环境变量控制:
虽然原生 Apache 不支持基于 env 的 QPS 限流,但可将 NEEDS_RATE_LIMIT 作为信号,转发给后端 Nginx 或通过 Lua 脚本(mod_lua)实现更灵活判断。
四、生产建议:不要只靠 Apache 单层防护
Apache 作为边缘 Web 服务器,适合做第一道轻量过滤;但真正的精准防刷应分层实施:
- 接入层(推荐):用 Nginx +
limit_req+ geoip2 模块,支持每 IP / 每 key(如 token)维度限流,性能远高于 Apache - 应用层:在业务代码中校验签名、时间戳、频次(如 Redis INCR + EXPIRE),应对参数级恶意刷量
- 网关层(微服务架构):统一 API 网关(如 Spring Cloud Gateway + Sentinel)做全链路流控与黑白名单,规则可热更新
- 白名单管理:避免硬编码,使用外部配置中心(如 Consul、Nacos)下发白名单列表,Apache 通过
mod_include或 Lua 动态加载
Apache 的角色,是守门人,不是消防员。把精准识别和复杂决策交给更适合的组件,它专注做好可信流量的快速放行与基础异常拦截即可。









