← 中文资源

简体中文版本

在 Nginx 边缘层添加限流

定义共享内存区,施加以突发额度与 nodelay 的 limit_req,并返回 429,使滥用客户端在到达应用前被降速。

阅读英文原文

概述

从一个客户端涌来的突发流量会耗尽应用的 worker,而边缘层若缺少廉价控制手段便无从缓解。Nginx 的共享区限流能在请求抵达应用前按标识降速,成本几乎为零。

关键步骤

  1. 以合适的客户端标识定义 limit_req_zone。
  2. 施加以突发额度与 nodelay 的 limit_req。
  3. 超限时返回 429 及 Retry-After。
  4. 谨慎选择键:代理后应优先用 API key 而非原始地址。

验证

  • 持续滥用会被限速至 429。
  • 短暂突发仍被容忍。
  • 共享 NAT 下的正常用户不被整段限速。
  • 超限响应带有 Retry-After。

注意事项

  • 除非各节点共享一致的区,Nginx 限流是按实例计。
  • 以原始地址为键在代理与共享 NAT 下会误伤错误客户端。

适用范围

本条目围绕「在 Nginx 边缘层添加限流」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

limit_req_zone $http_x_api_key zone=api:10m rate=20r/s;
server {
  location /api/ {
    limit_req zone=api burst=40 nodelay;
    limit_req_status 429;
    proxy_pass http://app;
  }
}