因此,实际上我使用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实例又该怎么办?据我了解,它会通过是因为他们不共享存储缓存的共享内存。
我一直在尝试对此进行研究,但找不到任何东西。任何帮助将不胜感激。
答案 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个地址。