Ruby on rails nginx limit_req rate limiting的问题-文档澄清?

Ruby on rails nginx limit_req rate limiting的问题-文档澄清?,ruby-on-rails,nginx,passenger,Ruby On Rails,Nginx,Passenger,我在nginx上与乘客/铁路一起工作时遇到了无止境的限速问题 混淆的一部分在于区分配置的哪些方面是基于每个客户端的,哪些是全局限制 我在为nginx的limit_req和limit_req_zone配置理想设置时遇到了一些问题。它似乎模糊地在语言之间切换,暗示这要么是特定于用户的,要么是全局应用的 在文档中,limit\u req\u zone行的具体工作方式相当模糊。此“区域”是全局的还是每个用户的?鉴于下面这句话,我的结论是否正确: limit_req_zone $binary_remote

我在nginx上与乘客/铁路一起工作时遇到了无止境的限速问题

混淆的一部分在于区分配置的哪些方面是基于每个客户端的,哪些是全局限制

我在为nginx的limit_req和limit_req_zone配置理想设置时遇到了一些问题。它似乎模糊地在语言之间切换,暗示这要么是特定于用户的,要么是全局应用的

在文档中,
limit\u req\u zone
行的具体工作方式相当模糊。此“区域”是全局的还是每个用户的?鉴于下面这句话,我的结论是否正确:

limit_req_zone $binary_remote_addr zone=update_requests:1m rate=20r/s;
  • $binary\u remote\u addr表示用户的IP地址
  • 这种表示法尤其可取,因为它比$remote\u addr?占用的空间更少?为什么这很重要或更可取
  • “区域”(在本例中)充满了其IP地址的表示
  • “速率”是允许请求离开队列的速率
  • 此“费率”和“区域”-它们是特定于客户的还是全局的
  • 我也不确定limit_req行,例如:

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


    一些背景信息,以防任何人真的感到无聊,并想看看我们试图解决的配置和一般问题:

    目前我有这个(摘录):

    我们定义了两个区域:

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

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

    我们发现,在负载过重的时候,当CPU核心耗尽时,该站点正逐渐停止运行——我们的更新代码中有一些错误,这意味着当连接断开时,查询会排队等待,并一直使服务器陷入困境,直到我们不得不暂时关闭该站点,并迫使用户注销并重新启动刷新他们的浏览器。。。实际上,我们自己也遭到了DDoS攻击:P我认为这最初是由我们的托管公司的一些连接问题造成的,这些问题导致大量请求在用户的浏览器中排队

    当我们解决这些bug时,我们警告客户,他们可能会收到奇怪的503“重载”消息,或者看到内容没有及时更新。限制速率的初衷是确保即使在负载较重的情况下,网站的日常页面也可以继续导航,同时限制更新内容的速率

    然而,我们现在看到的主要问题是,即使在更新代码中的错误已经(希望)解决之后,我们也不能在速率限制上取得很好的平衡。每当一个新内容被添加到网站上(并被我们的用户一次拉出来),我们设置的一切似乎都会在访问日志中产生503个不健康的错误


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

    您正在阅读哪些文档?非常清楚指令的用法和语法

    关于限制要求区域:

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

  • 一旦客户达到费率限制,客户可以继续提出请求;但是,服务器将延迟处理(试图降低客户端速度)。如果客户端继续发出高于速率限制的请求,并发送至少
    突发
    个请求,服务器将简单地删除所有请求(而不是减慢速度)。人们可能会用它来抵御DoS攻击或API滥用
  • 突发请求不依赖于时间。只有当客户端超过速率限制时,Burst才会生效
  • nodelay
    删除了处理
    burst
    值上的请求的延迟。如果不希望对任何速率受限的客户端进行处理,请将
    突发
    设置为0,并使用
    节点延迟
    。速率受限客户端的等待/延迟取决于
    limit\u req\u zone
    指定的速率限制

  • 非常感谢您的回复!我正在阅读的文档是您链接的文档,但我仍然认为它们不清楚哪些元素适用于全球范围,哪些元素适用于每个客户。为了进一步澄清,关于问题4。。。docs表示,限速是“漏桶”的一种实现,通常只有两个参数是a)bucket si
    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;
    }