nginx resource_error ai_generated true

nginx: [emerg] 1024 zones are not enough in "limit_conn_zone"

ID: nginx/limit-conn-zone-too-small

Also available as: JSON · Markdown · 中文
90%Fix Rate
85%Confidence
1Evidence
2024-07-18First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
nginx/1.18.0 active
nginx/1.20.0 active
nginx/1.24.0 active
nginx/1.26.0 active

Root Cause

The limit_conn_zone directive allocates a fixed number of slots (default 1024) for tracking connections per key, which is exhausted under high concurrency.

generic

中文

limit_conn_zone 指令为每个键分配了固定数量的插槽(默认 1024),在高并发下会耗尽。

Official Documentation

https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn_zone

Workarounds

  1. 90% success Increase the zone size in the limit_conn_zone directive: `limit_conn_zone $binary_remote_addr zone=addr:10m;` (default is 1m, which holds ~1024 zones)
    Increase the zone size in the limit_conn_zone directive: `limit_conn_zone $binary_remote_addr zone=addr:10m;` (default is 1m, which holds ~1024 zones)
  2. 85% success If using multiple keys, create separate zones for each key to distribute the load: `limit_conn_zone $server_name zone=server:5m; limit_conn_zone $binary_remote_addr zone=addr:5m;`
    If using multiple keys, create separate zones for each key to distribute the load: `limit_conn_zone $server_name zone=server:5m; limit_conn_zone $binary_remote_addr zone=addr:5m;`
  3. 75% success Monitor zone usage with the status module and adjust dynamically: add `stub_status;` to a location and check active connections to estimate required zone size.
    Monitor zone usage with the status module and adjust dynamically: add `stub_status;` to a location and check active connections to estimate required zone size.

中文步骤

  1. 增加 limit_conn_zone 指令中的区域大小:`limit_conn_zone $binary_remote_addr zone=addr:10m;`(默认是 1m,可容纳约 1024 个区域)
  2. 如果使用多个键,为每个键创建单独的区域以分散负载:`limit_conn_zone $server_name zone=server:5m; limit_conn_zone $binary_remote_addr zone=addr:5m;`
  3. 使用状态模块监控区域使用情况并动态调整:在 location 中添加 `stub_status;` 并检查活跃连接以估算所需的区域大小。

Dead Ends

Common approaches that don't work:

  1. 80% fail

    limit_conn controls the maximum number of connections per key, not the number of zones/slots available for tracking.

  2. 30% fail

    This eliminates the error but also removes the intended connection limiting functionality, potentially leading to resource exhaustion.

  3. 50% fail

    Large zones consume significant memory; if the system runs out of memory, nginx may crash or fail to start.