Nginx与limit_req_zone共享的内存

时间:2018-06-26 02:10:19

标签: nginx load-balancing reverse-proxy

因此,实际上我使用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实例又该怎么办?据我了解,它会通过是因为他们不共享存储缓存的共享内存。

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

1 个答案:

答案 0 :(得分:0)

如果用多个nginx表示多个主进程,则我不确定结果是什么。要运行多个主进程,它们将需要具有不同的配置/不同的端口进行绑定。

对于具有单个主实例的工作进程,共享内存恰好是共享的,所有工作程序将一起限制请求。代码文档中说:

  

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

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

此外,还有一个关于limit_req的博客条目,内容如下:

  

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

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