一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何利用 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 做压测验证效果。

热门栏目