【发布时间】: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;
- $binary_remote_addr 代表用户的IP地址
- 这种表示方式尤其可取,因为它占用的空间比 $remote_addr?为什么这很重要或更可取?
- “区域”(在这种情况下)充满了他们的 IP 地址的表示...?
- 'rate' 是允许请求离开队列的速率?
- 此“速率”和“区域” - 它们是特定于客户的还是全局的?
我也不确定 limit_req 行,例如为此:
limit_req zone=main_site burst=10 nodelay;
- 不完全确定爆发是什么意思。这里的文档也很模糊。我想这是许多请求。当请求系统的其余部分使用这个奇怪的“区域”系统时,为什么会有请求数?
- “突发”请求按....什么时间范围?
- '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