nginx location块中可通过limit_req限流、limit_conn限连、error_page降级实现路径级防护。限流基于令牌桶,支持突发缓冲;限连控制单ip并发连接数;降级用error_page返回兜底响应,三者可组合使用。

在 Nginx 的 location 块中加限流和降级,是把保护逻辑精准落到具体路径(比如 /api/order 或 /static/)的关键操作。它不依赖后端,生效快、开销低,适合应对突发流量或接口级防护。
限流:用 limit_req 控制请求节奏
这是最常用的路径级限流方式,基于令牌桶思想,支持突发缓冲:
- 先在
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
连接数限制:用 limit_conn 防止单 IP 占满资源
适用于防止爬虫或恶意客户端建立大量长连接耗尽 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可同时使用,互不冲突
降级:用 error_page 实现失败兜底
当后端挂了(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 返回 JSON 兜底内容:
location = /fallback/payment {
add_header Content-Type "application/json";
return 200 '{"code":503,"msg":"服务暂不可用,请稍后再试"}';
} - 这样既避免用户看到 Nginx 默认 50x 页面,也防止错误层层上抛导致雪崩
组合策略:按业务场景灵活搭配
真实接口常需多层防护,比如下单接口可同时设速率、连接数、失败降级:
- location /api/submit {
# 每秒最多 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可只做连接限制,或直接返回静态降级页,减少后端压力











