什么原因导致区域内存耗尽以及 Nginx 对此有何反应?

什么原因导致区域内存耗尽以及 Nginx 对此有何反应?

耗尽指定给连接区域的内存的可能情况是什么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-233​​722

服务器将能够跟踪约 16k 个不同客户端 IP 地址的连接数。如果您恰好有这么多活动客户端,那么来自 IP 未知的客户端的下一次连接尝试将尝试创建新状态,这将失败,因为区域已耗尽,客户端将返回 503。

因此,如果连接数减少到 16000 以下(或任何限制),未来的连接将不会出现 503。

相关内容