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

最新下载

热门教程

Nginx Location 配置中限流降级如何加

时间:2026-08-16 12:00:49 编辑:袖梨 来源:一聚教程网

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

在 Nginx 的 location 块中加限流和降级,是把保护逻辑精准落到具体路径(比如 /api/order/static/)的关键操作。它不依赖后端,生效快、开销低,适合应对突发流量或接口级防护。

限流:用 limit_req 控制请求节奏

这是最常用的路径级限流方式,基于令牌桶思想,支持突发缓冲:

  1. 先在 http 块定义限流区域,例如按 IP 限速每秒 10 次、最多缓存 30 个待处理请求:

    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

  2. 然后在目标 location 中启用:

    location /api/ {

    limit_req zone=api_limit burst=30 nodelay;

    proxy_pass http://backend;

    }

  3. burst=30 表示允许短时积压最多 30 个请求;nodelay 让它们立刻被处理(不排队等令牌),适合对延迟敏感的接口;若去掉 nodelay,超限请求会按固定节奏释放,响应更平滑但可能变慢
  4. 如需区分用户身份(比如登录态),可改用 $http_x_user_id 作 key,前提是业务已透传该 header

连接数限制:用 limit_conn 防止单 IP 占满资源

适用于防止爬虫或恶意客户端建立大量长连接耗尽 worker 连接数:

  1. http 块定义连接限流区:

    limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;

  2. location 中限制每个 IP 最多 5 个并发连接:

    location /upload {

    limit_conn conn_per_ip 5;

    client_max_body_size 100m;

    proxy_pass http://upload_backend;

    }

  3. 注意:limit_conn 统计的是当前活跃 TCP 连接数,不是请求数;它和 limit_req 可同时使用,互不冲突

降级:用 error_page 实现失败兜底

当后端挂了(502/503/504)或限流触发(429),Nginx 不应直接抛错,而应返回轻量、可控的响应:

  1. location 内拦截错误并重定向到本地 fallback:

    location /api/payment {

    proxy_pass http://payment_svc;

    proxy_next_upstream off;

    error_page 502 503 504 429 =200 /fallback/payment;

    }

  2. 再配一个内部 location 返回 JSON 兜底内容:

    location = /fallback/payment {

    add_header Content-Type "application/json";

    return 200 '{"code":503,"msg":"服务暂不可用,请稍后再试"}';

    }

  3. 这样既避免用户看到 Nginx 默认 50x 页面,也防止错误层层上抛导致雪崩

组合策略:按业务场景灵活搭配

真实接口常需多层防护,比如下单接口可同时设速率、连接数、失败降级:

  1. 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;

    }

  2. 非核心路径如 /api/report 可只做连接限制,或直接返回静态降级页,减少后端压力

热门栏目