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 个请求将限流策略应用到具体路径,比如 /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_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 做压测验证效果。