【问题标题】:Nginx shared memory with limit_req_zone带有limit_req_zone的Nginx共享内存
【发布时间】:2018-06-26 02:10:18
【问题描述】:

所以实际上我使用 nginx 来反向代理(和负载平衡)一些带有 nginx 的 API 后端服务器,并且我使用指令 limit_req_zone 来限制每个 IP 和 URI 的最大请求数。没问题。

最终我们可能需要扩展并添加更多的 nginx 实例。每个 nginx 实例都使用“共享内存区域”来临时保存(我猜是在缓存中)每个请求,这样它就可以根据上面提到的limit_req_zone 正确检查请求是否通过。话虽如此,如果多个 nginx 同时运行,nginx 是如何处理的呢?

例如:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

这告诉 nginx 每秒只允许来自同一 IP 地址的 1 个请求,但是如果第二个请求(在同一秒内)到达另一个 nginx 实例呢?据我了解,它会通过,因为他们不共享存储缓存的共享内存,我猜。

我一直在尝试对此进行一些研究,但找不到任何东西。任何帮助将不胜感激。

【问题讨论】:

    标签: nginx load-balancing reverse-proxy


    【解决方案1】:

    如果多个 nginx 是指多个主进程,我不完全确定结果是什么。要让多个主进程运行,它们需要有不同的配置/不同的端口来绑定。

    对于具有单个主实例的工作进程,共享内存正是共享的,并且所有工作人员会将请求限制在一起。代码文档说:

    shared_memory — 共享内存区域列表,每个区域通过调用 ngx_shared_memory_add() 函数添加。共享区域在所有 nginx 进程中映射到相同的地址范围,用于共享公共数据,例如 HTTP 缓存内存树。

    http://nginx.org/en/docs/dev/development_guide.html#cycle

    另外,还有一篇关于limit_req 的博文,内容如下:

    Zone – 定义用于存储每个 IP 地址状态的共享内存区域以及它访问请求受限 URL 的频率。将信息保存在共享内存中意味着它可以在 NGINX 工作进程之间共享。该定义有两部分:由 zone= 关键字标识的区域名称,以及冒号后面的大小。大约 16,000 个 IP 地址的状态信息需要 1 MB,因此我们的区域可以存储大约 160,000 个地址。

    取自https://www.nginx.com/blog/rate-limiting-nginx/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 2014-10-08
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      相关资源
      最近更新 更多