最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何利用 Nginx 为敏感接口设置访问频次阈值
时间:2026-06-18 09:16:47 编辑:袖梨 来源:一聚教程网
Nginx可通过limit_req模块对敏感接口限流,核心是定义限流区域、设定速率阈值并绑定到location;需在http块用limit_req_zone指定键与速率,在location中用limit_req引用zone,配合burst、nodelay、error_page及日志实现精细化控制。
可以通过 Nginx 的 limit_req 模块对敏感接口做请求频次限制,核心是定义限流区域、设定速率阈值,并精准绑定到目标 location。
定义限流共享内存区域
在 http 块中使用 limit_req_zone 指令创建限流规则,指定键(如用户 IP 或 token)、内存大小和平均速率:
- 常用键:用
$binary_remote_addr基于客户端 IP 限流(节省内存) - 更精细控制:可结合
$arg_token或$http_authorization提取身份标识,实现按用户限流 - 示例:
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;表示每秒最多 5 个请求
在敏感接口 location 中启用限流
将限流策略应用到具体路径,比如 /api/v1/user/info 这类需保护的接口:
- 使用
limit_req指令引用前面定义的 zone,如limit_req zone=api_limit burst=10 nodelay; -
burst允许短时突发请求,超出部分排队或直接拒绝(取决于是否带nodelay) - 加
nodelay时,超出速率的请求立即返回 503;不加则排队等待,超时后丢弃
配合返回状态码与日志便于监控
限流触发时默认返回 503,但可统一拦截并返回更友好的响应:
- 用
error_page 503 = @rate_limited重定向到自定义处理块 - 在
@rate_limited中返回 JSON 提示,如{"code":429,"msg":"请求过于频繁"} - 开启
limit_req_log_level warn;,将超限请求记为 warning 级别,方便排查
进阶:区分内外网或登录态做差异化限流
单一 IP 限流可能误伤 NAT 用户,可通过变量组合实现更合理策略:
- 对已登录用户(如携带有效 JWT),提取
$jwt_claim_sub(需配合nginx-jwt模块)做用户级限流 - 内网调用可跳过限流:
if ($remote_addr ~ "^10.|172.(1[6-9]|2[0-9]|3[0-1]).|192.168.") { set $limit "";},再在 limit_req 中用zone=api_limit burst=10 $limit - 敏感操作(如密码修改)可单独配置更严策略,例如
rate=1r/m(每分钟 1 次)
不复杂但容易忽略的是 key 的选择和 burst 的平衡——太严影响体验,太松失去防护意义。实际部署前建议用 ab 或 wrk 做压测验证效果。