耗尽指定给连接区域的内存的可能情况是什么limit_conn_zone
指令以及在本案中的含义是什么?
假设我的配置中有这个:
http {
limit_conn_zone $binary_remote_addr zone=connzone:1m;
...
server {
limit_conn connzone 5;
根据文档,它connzone
在 64 位服务器上分配了 16000 个状态。它还说
如果某个区域的存储空间耗尽,服务器将向所有进一步的请求返回错误 503(服务暂时不可用)。
好吧,好吧。但这在实践中意味着什么?什么时候会发生这种情况?谁会收到这些 503?这是否意味着如果 IP 数量不知何故与connzone
点击数 16000 相关的是,每个人都得到 503,然后就结束了?Nginx 如何决定?文档对此含糊不清。
那么,考虑到示例配置,谁会真正得到 503,在什么情况下,事情会如何发展?同样请求区域?
答案1
实践?您可以控制连接到服务器的 IP 总量。
什么时候?嗯,如果区域已满。
WHO?是的,所有不在该区域内的人,只要该区域已满。
如果您使用的是 64 位系统并将区域设置为 1M,则 nginx 最多可以存储 16,000 个 IP。这意味着,如果必须存储 16,001 个 IP,则 +1 用户将收到第一个 503 错误。决定很简单,如果B-树已满,拒绝。
您可以通过阅读模块的源代码来了解具体的实现:https://github.com/git-mirror/nginx/blob/master/src/http/modules/ngx_http_limit_conn_module.c
请求区域的工作原理非常相似。
答案2
引自http://forum.nginx.org/read.php?2,233709,233722#msg-233722
服务器将能够跟踪约 16k 个不同客户端 IP 地址的连接数。如果您恰好有这么多活动客户端,那么来自 IP 未知的客户端的下一次连接尝试将尝试创建新状态,这将失败,因为区域已耗尽,客户端将返回 503。
因此,如果连接数减少到 16000 以下(或任何限制),未来的连接将不会出现 503。