缓存清理接口是高危操作,需通过内网限制、IP+路径双重限流、零突发限流策略及日志监控四层防护。具体包括:仅允许可信内网IP访问;用$binary_remote_addr$uri组合键限流;配置burst=1 nodelay实现每分钟最多2次请求;记录$limit_req_status用于异常告警。

缓存清理(Purge)接口本质是高危管理操作,一旦暴露且无防护,极易被扫描器批量探测或恶意调用,导致缓存雪崩、后端压垮甚至服务瘫痪。Nginx 的 limit_req 模块是第一道轻量高效防线,关键在于“严控频次 + 精准识别 + 快速拦截”。
只允许可信来源访问
不能只靠限流,得先缩小攻击面。Purge 接口不应对外网开放,应限制为内网运维 IP 或反向代理出口 IP:
- 在
location块中加allow/deny规则,例如:allow 10.0.1.0/24;allow 127.0.0.1;deny all; - 若走反向代理(如 CDN 或 API 网关),确保
$binary_remote_addr是真实客户端 IP —— 否则需用$http_x_forwarded_for并配合set_real_ip_from设置可信上游。
按 IP + 路径双重限流
单靠 IP 限流不够,因为多个 purge 路径(如 /purge/foo、/purge/bar)可能被轮询攻击。用组合 key 实现更细粒度控制:
- 定义 zone:
limit_req_zone "$binary_remote_addr$uri" zone=purge_ip_path:10m rate=1r/m;
这样每个 IP 对每个 purge 路径单独计数,1 分钟最多 1 次。 - 避免用
$args,因 purge 参数(如?url=xxx)可能动态变化,导致哈希冲突或内存膨胀;$uri更稳定可控。
强制低频 + 零突发 + 立即拒绝
Purge 不是用户功能,不存在“体验”需求,必须杜绝任何弹性空间:
- 配置示例:
location ~ ^/purge/ {limit_req zone=purge_ip_path burst=1 nodelay;# 其他 allow/deny 和 auth_basic 等校验} -
burst=1表示桶容量为 1(即仅允许当前令牌+1个排队请求);nodelay让超出的请求立刻返回 503,不排队等待;rate=1r/m确保长期几乎不可刷。 - 注意:
burst=1 nodelay实际效果≈每分钟最多处理 2 个请求(1 个即时 + 1 个刚进桶),已足够覆盖人工运维场景。
配合日志与监控快速响应
限流只是兜底,要主动发现异常:
- 在 location 中添加自定义日志字段,记录被限流的请求:
log_format purge_log '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $limit_req_status';
其中$limit_req_status会显示hit(触发限流)、miss(未触发)、rejected(被拒绝)等状态。 - 用日志工具(如 Loki + Grafana)对
rejected高频 IP 做告警,配合limit_conn或防火墙临时封禁。

















