Nginx location块中可通过limit_req限流、limit_conn限连、error_page降级实现路径级防护。限流基于令牌桶,支持突发缓冲;限连控制单IP并发连接数;降级用error_page返回兜底响应,三者可组合使用。
在 Nginx 的 location 块中加限流和降级,是把保护逻辑精准落到具体路径(比如 /api/order 或 /static/)的关键操作。它不依赖后端,生效快、开销低,适合应对突发流量或接口级防护。
这是最常用的路径级限流方式,基于令牌桶思想,支持突发缓冲:
http 块定义限流区域,例如按 IP 限速每秒 10 次、最多缓存 30 个待处理请求:limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
location 中启用:location /api/ {
limit_req zone=api_limit burst=30 nodelay;
proxy_pass http://backend;
}
burst=30 表示允许短时积压最多 30 个请求;nodelay 让它们立刻被处理(不排队等令牌),适合对延迟敏感的接口;若去掉 nodelay,超限请求会按固定节奏释放,响应更平滑但可能变慢$http_x_user_id 作 key,前提是业务已透传该 header适用于防止爬虫或恶意客户端建立大量长连接耗尽 worker 连接数:
http 块定义连接限流区:limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;
location 中限制每个 IP 最多 5 个并发连接:location /upload {
limit_conn conn_per_ip 5;
client_max_body_size 100m;
proxy_pass http://upload_backend;
}
limit_conn 统计的是当前活跃 TCP 连接数,不是请求数;它和 limit_req 可同时使用,互不冲突当后端挂了(502/503/504)或限流触发(429),Nginx 不应直接抛错,而应返回轻量、可控的响应:
location 内拦截错误并重定向到本地 fallback:location /api/payment {
proxy_pass http://payment_svc;
proxy_next_upstream off;
error_page 502 503 504 429 =200 /fallback/payment;
}
location = /fallback/payment {
add_header Content-Type "application/json";
return 200 '{"code":503,"msg":"服务暂不可用,请稍后再试"}';
}
真实接口常需多层防护,比如下单接口可同时设速率、连接数、失败降级:
# 每秒最多 3 个请求,突发允许 10 个
limit_req zone=submit_qps burst=10 nodelay;
# 每个 IP 最多 2 个并发连接
limit_conn conn_per_ip 2;
# 后端异常或限流超载时返回兜底
error_page 502 503 504 429 =200 /fallback/submit;
proxy_pass http://order_backend;
}
/api/report 可只做连接限制,或直接返回静态降级页,减少后端压力