【问题标题】:Issues with nginx limit_req rate limiting - docs clarification?nginx limit_req 速率限制问题 - 文档说明?
【发布时间】:2014-12-16 10:39:11
【问题描述】:

在 nginx 上使用载客/铁路工作时,我遇到了无穷无尽的问题。

部分混淆来自于区分配置的哪些方面是基于每个客户端工作的,哪些是全局限制。

我在了解 nginx 的 limit_req 和 limit_req_zone 配置的理想设置时遇到了问题。它似乎在语言之间模糊地翻转,暗示这是特定于用户或适用于全球的。

在文档中,limit_req_zone 行的工作原理非常模糊。这个“区域”是全局的还是每个用户的?鉴于以下内容,我的以下结论是否正确:

limit_req_zone $binary_remote_addr zone=update_requests:1m rate=20r/s;
  1. $binary_remote_addr 代表用户的IP地址
  2. 这种表示方式尤其可取,因为它占用的空间比 $remote_addr?为什么这很重要或更可取?
  3. “区域”(在这种情况下)充满了他们的 IP 地址的表示...?
  4. 'rate' 是允许请求离开队列的速率?
  5. 此“速率”和“区域” - 它们是特定于客户的还是全局的?

我也不确定 limit_req 行,例如为此:

limit_req zone=main_site burst=10 nodelay;
  1. 不完全确定爆发是什么意思。这里的文档也很模糊。我想这是许多请求。当请求系统的其余部分使用这个奇怪的“区域”系统时,为什么会有请求数?
  2. “突发”请求按....什么时间范围?
  3. 'nodelay',据我了解,如果队列中有其他请求,则意味着立即处理 503 错误,而不是等待队列完成。 a) 等多久? b) 这是否意味着在这种情况下会忽略“burst”设置?

谢谢。


一些背景信息,以防万一有人真的很无聊,想看看我们正在尝试解决的配置和一般问题:

目前我有这个(摘录):

limit_req_zone $binary_remote_addr zone=main_site:10m rate=40r/s;
limit_req_zone $binary_remote_addr zone=update_requests:1m rate=20r/s;

server {
  listen        80;
  server_name   [removed];
  root          [removed];
  include       rtmp_proxy_settings;

  try_files $uri /system/maintenance.html @passenger;
  location @passenger {
    passenger_max_request_queue_size 0; # 256;
    limit_rate_after 2048k;
    limit_rate 512k;
    limit_req zone=main_site burst=10 nodelay;
    limit_conn addr 5;
    passenger_enabled on;
    passenger_min_instances 3;
  }

  location ~ ^/update_request {
    passenger_enabled on;
    limit_req zone=update_requests burst=5 nodelay;
  }


  gzip on;
  gzip_min_length 1000;
  gzip_proxied expired no-cache no-store private auth;
  gzip_types text/plain application/xml application/javascript text/javascript text/css;
  gzip_disable "msie6";
  gzip_http_version 1.1;
}

我们定义了两个区域:

a) “main_site”,旨在捕捉一切 b) “update_request”,当小(缓存)文件中的时间戳发生变化时,客户端上的 JS 通过 AJAX 轮询更新内容

就其性质而言,这往往意味着我们在 1 或 2 分钟内的流量相当低,但随后可能有 10,000 个客户端同时访问服务器以获取此更新的内容(从数据库以略有不同的方式提供服务)取决于过滤器、访问权限等)

我们发现,在重负载期间,当 CPU 内核用尽时,网站会停止运行 - 我们在更新代码中存在一些错误,这意味着当连接断开时,查询会排队等待一直使服务器陷入瘫痪,直到我们不得不暂时关闭网站并强制用户注销并刷新他们的浏览器......实际上我们自己进行了 DDoS 攻击:PI 认为这最初是由我们托管公司方面的一些连接问题引起的在用户浏览器中排队的一堆请求。

虽然我们解决了错误,但我们警告客户他们可能会收到奇怪的 503“重载”消息或看到内容没有及时更新。限速的初衷是确保网站的日常页面即使在负载过重时也能继续浏览,同时对更新内容进行限速。

然而,我们现在看到的主要问题是,即使更新代码中的错误已经(希望)消除,我们也无法在速率限制上取得很好的平衡。每当向网站添加新内容(并由我们的用户一次全部提取)时,我们设置的所有内容似乎都会在访问日志中生成数量不正常的 503 错误

我们正在这里寻找各种缓存方面的解决方案,但理想情况下,我们仍然希望受到某种速率限制的保护,这种限制不会在日常操作中影响用户。

【问题讨论】:

    标签: ruby-on-rails nginx passenger


    【解决方案1】:

    您正在阅读哪些文档? http://nginx.org/en/docs/http/ngx_http_limit_req_module.html 非常清楚指令的用法和语法。

    关于limit_req_zone

    1. 是的。
    2. 在您的示例中,您分配了 1MB 的空间来存储“当前过多请求数”的列表。每个项目/键使用的空间越少,您可以存储的越多。 “如果区域存储耗尽,服务器将向所有进一步的请求返回 503(服务暂时不可用)错误。”
    3. 您需要跟踪哪些客户端应该受到速率限制。
    4. Rate 是客户端在指定时间段内可以发出的最大请求数。
    5. limit_req_zone 的上下文仅限于 http,使其具有全局性。

    关于limit_req

    1. 一旦客户端达到速率限制,客户端可以继续发出请求;但是,服务器会延迟处理(试图减慢客户端的速度)。如果客户端继续发出超过速率限制的请求,并发送至少burst 个请求,服务器将简单地丢弃所有请求(而不是放慢速度)。人们可能会使用它来抵御 DoS 攻击或 API 滥用。
    2. 突发请求不依赖于时间。仅当客户端超过速率限制时才会启动突发。
    3. nodelay 消除了处理超过 burst 值的请求的延迟。如果您不希望对任何速率受限的客户端进行处理,请将 burst 设置为 0 并使用 nodelay。速率受限客户端的等待/延迟取决于limit_req_zone 指定的速率限制。

    【讨论】:

    • 非常感谢您的回复!我正在阅读的文档是您链接的文档,但我仍然认为它们不清楚哪些元素适用于全球,哪些元素适用于每个客户。只是为了进一步澄清,关于问题 4... 文档说速率限制是“漏桶”的实现,其中通常只有两个参数是 a)桶大小和 b)退出率。文档在这方面有错吗?您确定“速率”是“客户在指定时间段内可以发出的最大请求数”还是实际上是该区域的退出率?
    • 在您对问题 5 的回复中,您还说 limit_req_zone 设置的上下文是全局的(可能包括“速率”部分),但在第四季度,您说速率是每个客户端的。我不是想抓住你,只是想强调我的困惑所在……Web 服务器管理员对我来说是相当新的,所以要花一些时间来掌握这些东西。再次感谢您的帮助!
    • 相信关于“漏桶”的文档。 limit_req_zone 是全局声明的,这意味着区域可以被任何虚拟主机使用;但是,只有为虚拟主机配置了limit_req,速率限制才会生效。
    • Re 7. 这是否意味着如果我的限制速率为“1r/s”,那么在一秒钟后(如果在那段时间内没有来自该 IP 的请求)IP 不再超过速率限制在这种情况下“突发”计数器再次启动?这是否意味着如果我的速率限制是“1r/s”和“突发 3”,那么在某些边缘情况下,我可能每秒总共收到多达 4 个(速率限制 + 突发)请求?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2015-04-21
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多