nginx不存在“自定义变量缓存区”,变量系统为惰性求值、零拷贝,不分配动态内存;真正需防护的是请求头、请求体及代理缓冲区,应通过client_header_buffer_size、client_max_body_size、proxy_buffers等参数精准限制其大小与超时,从协议层阻断内存耗尽攻击路径。

Nginx 本身没有“自定义变量缓存区”这一概念,也不存在专门用于缓存用户自定义变量(如 $my_var)的独立内存区域。所谓“针对变量解析器的内存耗尽攻击”,在 Nginx 架构中并不构成真实威胁——因为 Nginx 的变量系统是惰性求值、只读引用、零拷贝解析的,不分配动态缓冲区来“存储变量内容”。
真正可被滥用、导致内存耗尽的,是以下三类有明确缓冲区配置项的实体:
- 请求头(headers)→ 对应
client_header_buffer_size和large_client_header_buffers - 请求体(body)→ 对应
client_max_body_size和client_body_buffer_size - 代理/响应缓冲(proxy, fastcgi 等)→ 对应
proxy_buffer_size、proxy_buffers、fastcgi_buffer_size等
这些才是攻击者可能利用的内存入口点。所谓“变量解析器攻击”,实际往往是通过构造超长请求头(如 Cookie: a=1&b=2&... 拼出数MB)、超大 POST body 或畸形代理响应,间接触发缓冲区分配失控。
所以,杜绝内存耗尽攻击的关键不是限制“变量缓存”,而是精准收紧这三类真实缓冲区边界,并切断慢速注入路径:
严格限制请求头大小,防 JWT/Cookie 膨胀攻击
-
client_header_buffer_size 1k;:初始缓冲设为 1KB,覆盖绝大多数普通请求 -
large_client_header_buffers 2 4k;:最多允许 2 块 × 4KB = 8KB 总头空间,拒绝超长 Token 或嵌套 trace 头 -
client_header_timeout 8s;:头读取超时设为 8 秒,防逐字节慢发耗尽连接槽 -
underscores_in_headers off;:关闭下划线解析,避免绕过鉴权字段歧义
精准控制请求体上限,阻断分片上传滥用
- 在需上传的
location块中单独设置:client_max_body_size 200M; - 同时配
client_body_buffer_size 4k;:让中小请求走内存,大请求走磁盘(需确保client_body_temp_path可写且有配额) -
client_body_timeout 15s;:body 接收中断超时,防慢速 POST - 若用作反向代理上传入口,加
proxy_buffering off; proxy_request_buffering off;(Nginx ≥1.16)
锁死代理层缓冲,防止响应放大
-
proxy_buffer_size 4k;:仅缓存响应头,不缓整个 body -
proxy_buffers 8 64k;:总缓冲上限 512KB,避免后端吐大文件时吃光 worker 内存 -
proxy_busy_buffers_size 128k;:限制正在发送中的缓冲数据量,防阻塞 -
proxy_max_temp_file_size 100m;:限制临时文件大小,配合磁盘配额使用
这些配置共同构成内存防护水位线,不是靠“堵变量”,而是从协议层源头掐断非法载荷的进入路径和驻留机会。Nginx 的变量机制本身不分配堆内存,无需、也无法对它单独设限。











