nginx 可基于请求头、请求方法、url 参数等 http 字段灵活限流:用 $http_apikey 按 api key 限流,$request_method 限制 post 等高开销方法,$arg_uid 或组合参数按业务维度限频,并支持自定义 429 响应。

在 Nginx 中,基于 HTTP 协议字段(如请求头、请求方法、URL 参数等)做限流,核心是灵活定义 limit_req_zone 的 key 参数,让限流逻辑不再局限于 IP,而是绑定到实际业务维度上。
按请求头字段限流(例如 API Key 或 Token)
适用于多租户 API、需鉴权的接口。Nginx 会提取请求头中的指定字段值作为限流标识:
- 在
http块中定义规则:limit_req_zone $http_apikey zone=by_apikey:10m rate=100r/m;
→ 使用$http_apikey提取请求头API-Key:的值;每个不同 key 独立计数 - 在
location中启用:limit_req zone=by_apikey burst=10 nodelay; - 建议配合前置校验,避免空 key 被计入:
if ($http_apikey = "") { return 401 "Missing API Key"; }
按请求方法限流(例如只限制 POST)
对高开销操作单独设防,比如登录、提交表单等 POST 接口:
- 利用内置变量
$request_method:limit_req_zone $request_method zone=by_method:1m rate=5r/s;
→ 此例中所有 POST 请求共用一个计数器(因为 key 是固定字符串 "POST") - 更实用的做法是组合使用,例如仅对 POST + 特定路径限流:
limit_req_zone "$request_method:$uri" zone=post_login:10m rate=2r/s;
→ 区分POST /login和POST /register - 应用时注意:GET/HEAD 等安全方法通常无需严格限流,可不启用该规则
按 URL 参数或自定义字段限流
适合需要按用户 ID、设备号、渠道来源等动态维度控制的场景:
- 提取查询参数:
limit_req_zone $arg_uid zone=by_uid:10m rate=20r/h;
→ 对?uid=123中的 uid 值做每小时 20 次限制 - 组合多个字段增强粒度:
limit_req_zone "$arg_appid:$arg_version" zone=app_rate:10m rate=50r/m;
→ 针对特定 App ID + 版本组合限频 - 若字段可能为空或非法,可用
map做预处理,过滤无效值再参与限流
自定义响应与状态码
提升用户体验和排查效率,不建议默认返回 503:
- 全局设置限流响应码:
limit_req_status 429;(放在 http 或 server 块) - 配合
error_page返回结构化提示:error_page 429 /rate_limited;<br>location = /rate_limited {<br> internal;<br> return 429 '{"code":429,"msg":"Too many requests"}';<br>} - 确保返回内容类型正确(如加
add_header Content-Type "application/json";)











