nginx 防御缓冲区溢出攻击的核心是精准限制请求体大小:通过 client_max_body_size 设定阈值(如200m),在解析头后、读取body前返回413;配合 client_body_buffer_size(建议2k–8k)控制内存缓存,避免临时文件io或内存耗尽;同步配置 client_body_timeout 和 proxy_buffering off 等防止慢速攻击与代理层放大风险。

直接限制请求体大小,是 Nginx 防御缓冲区溢出攻击最基础也最有效的手段之一。关键不是“能不能传”,而是“在哪个环节拦、拦多大、怎么拦得干净又不误伤正常业务”。
核心配置:client_max_body_size
这是专用于控制 HTTP 请求体(即 POST/PUT 的 body 数据,如文件上传、JSON 表单)最大允许尺寸的指令。Nginx 在解析完请求头后、读取 body 前就做判断,超限立即返回 413 Request Entity Too Large,不进后端、不占缓冲区、不触发临时文件写入。
- 默认值为 1m(1MB),对 API 或表单足够,但远低于分片上传、大附件等场景需求
- 设为 0 表示禁用检查——不推荐,等于主动关闭防护入口
- 建议按业务实际设定,例如:
client_max_body_size 200M;(Vue 分片上传常用)或client_max_body_size 50M;(企业文档系统) - 该指令可出现在
http、server、location块中,越靠近 location 越精准;如仅某接口需大上传,只在对应 location 中设置即可
配合 client_body_buffer_size 控制内存使用
仅设 client_max_body_size 不够——它只做“门禁”,不管理“候车室”。真正决定是否把 body 全部缓存在内存里的,是 client_body_buffer_size。
- 默认通常为 8k 或 16k,表示单次接收 body 数据的内存缓冲区大小
- 若 body 小于该值,全程走内存,效率高;若超过,Nginx 会尝试写入临时文件(路径由
client_body_temp_path指定) - 为降低内存压力、避免小请求意外吃光 worker 内存,可适当调低,例如:
client_body_buffer_size 1k; - 注意:调得太小会导致频繁磁盘 IO;调得太大又削弱防护效果。平衡点一般在 2k–8k 区间
别漏掉 timeout 和代理层联动
攻击者可能用慢速、分段方式发送超大 body,绕过 size 检查却持续占用连接与缓冲资源。必须同步收紧时间窗口,并确认代理行为不放大风险。
-
client_body_timeout 12s;:从收到请求头后开始计时,若 body 数据中断超时,直接断连 - 若 Nginx 作反向代理,还需检查
proxy_buffering是否开启——开启时它会暂存整个响应体,可能二次放大内存压力;大文件上传场景建议在对应 location 中显式关闭:proxy_buffering off; - 同时确认
proxy_request_buffering off;(Nginx 1.16+),防止 Nginx 自行缓存并重放原始 body,引发重复解析或 header 膨胀
验证与可观测性
配置生效后,不能只靠“没报错”判断成功。要主动验证边界行为,并通过日志定位真实瓶颈。
- 用
curl -X POST --data-binary @large-file.bin测试略超限和刚好达标的情况 - 错误日志中出现 "client intended to send too large body" → 确认是
client_max_body_size生效 - 出现 "client closed connection while waiting for request body" 或大量 "upstream prematurely closed connection" → 检查 timeout 或后端提前断连
- 监控
nginx_stub_status中的 Active connections 和 Writing 数值,突增可能暗示缓冲区被异常占满











