nginx实现精准防刷+流控+白名单需组合geo/map标记白名单、limit_req分区限流、set_real_ip_from修正真实ip,并叠加referer/user-agent/参数校验;白名单必须优先生效且基于$realip_remote_addr判断。

Nginx 实现“精准防刷 + 流控 + 白名单”不是靠单一指令,而是组合策略:白名单绕过限流、非白名单走严格流控、且所有规则对真实客户端 IP 生效。关键在于顺序、作用域和 IP 识别准确性。
白名单必须优先于限流生效
如果白名单用户也被限速,说明规则没“跳过”流控逻辑。正确做法是:用 geo 或 map 提前标记可信 IP,再在 limit_req 中排除它们。
- 在
http块顶部定义白名单变量:
geo $is_whitelist {
default 0;
203.0.113.45 1; # 单个IP
192.168.10.0/24 1; # 内网段
2001:db8::/32 1; # IPv6
}
- 基于该变量创建“豁免区”:
limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s; limit_req_zone $is_whitelist zone=whitelist:1m rate=1000r/s;
- 在 location 中启用时,用
burst和nodelay配合:
location /api/ {
limit_req zone=perip burst=10 nodelay;
limit_req zone=whitelist burst=0;
}
解释:当 $is_whitelist = 1,请求进入 whitelist 区——速率设为极高(实际等效于不限),burst=0 确保不排队;而普通 IP 走 perip 区受严格限制。
确保识别的是真实客户端 IP
云环境、SLB、CDN 或反向代理后,$remote_addr 默认是上游 IP,不是用户真实 IP。不修正会导致白名单失效、流控误判。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 确认你信任的代理 IP 段(如阿里云 SLB 常用
100.64.0.0/16,腾讯云为100.100.0.0/16) - 在
http或server块中添加:
set_real_ip_from 100.64.0.0/16; real_ip_header X-Forwarded-For; real_ip_recursive on;
- 之后所有基于 IP 的判断(
geo、limit_req_zone、allow)都应使用$realip_remote_addr替代$remote_addr(需在 geo/map 中显式引用)
防刷要区分行为,不止看频率
单纯限速无法防工具刷接口(比如用不同 IP 轮询)。建议叠加多维度校验:
- Referer 检查:对敏感 API 强制要求合法来源
- User-Agent 过滤:拦截明显爬虫标识(但慎用,部分合法客户端也含 bot 字样)
- 请求头特征:例如检查是否携带必要 token 或自定义 header
-
参数校验:如
/login接口要求captcha参数非空
示例:
location /login {
if ($arg_captcha = "") { return 400; }
if ($http_user_agent ~* "(curl|httpie|python-requests)") { return 403; }
limit_req zone=login_limit burst=2 nodelay;
}
运维友好:白名单与流控规则分离管理
避免把几十个 IP 写死在主配置里。推荐用 include 外部文件:
- 新建
/etc/nginx/conf.d/whitelist.conf:
geo $is_whitelist {
default 0;
include /etc/nginx/ip_lists/admin_ips.conf;
include /etc/nginx/ip_lists/partner_ips.conf;
}
- 每个
.conf文件只放 allow 行,如admin_ips.conf:
192.168.5.10 1; 192.168.5.11 1; 203.0.113.0/24 1;
- 修改后只需
nginx -t && nginx -s reload,无需重启,支持热更新










