gpt4 book ai didi

ruby-on-rails - nginx limit_req 速率限制问题 - 文档说明?

转载 作者:行者123 更新时间:2023-12-04 06:36:55 25 4
gpt4 key购买 nike

我在使用乘客/rails 对 nginx 进行速率限制时遇到了无穷无尽的麻烦。

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

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

在文档中,limit_req_zone 的确切方式非常模糊。线作品。这个“区域”是全局的还是每个用户的?鉴于以下行,我在以下结论中是否正确:

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

  • 我也不确定 limit_req 行,例如为了这:
    limit_req zone=main_site burst=10 nodelay;
  • 不完全确定爆发是什么意思。这里的文档也很模糊。我想这是一些请求。当其余的请求系统使用这个奇怪的“区域”系统时,为什么会出现请求数量?
  • “突发”请求是在……什么时间范围内?
  • 'nodelay',据我所知,如果队列中有其他请求,则立即提供 503 错误,而不是等待队列完成。 a) 等多久? b) 这是否意味着在这种情况下忽略“突发”设置?

  • 谢谢。

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

    目前我有这个(摘录):
    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 错误

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

    最佳答案

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

    关于limit_req_zone :

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

  • 关于 limit_req :
  • 一旦客户端达到速率限制,客户端可以继续发出请求;但是,服务器将延迟处理(试图减慢客户端速度)。如果客户端继续发出超过速率限制的请求,并且至少发送 burst请求数量,服务器将简单地丢弃所有请求(而不是减慢速度)。人们可能会使用它来抵御 DoS 攻击或 API 滥用。
  • 突发请求与时间无关。 Burst 仅在客户端超过速率限制时才会启动。
  • nodelay消除处理请求的延迟 burst值(value)。如果您不想处理任何速率受限的客户端,请设置 burst到 0 并使用 nodelay .速率受限客户端的等待/延迟取决于 limit_req_zone 指定的速率限制.
  • 关于ruby-on-rails - nginx limit_req 速率限制问题 - 文档说明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26482734/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com