nginx通过预设边界、两级缓冲(client_header_buffer_size与large_client_header_buffers)、超时控制(client_header_timeout)及禁用下划线解析等机制,在请求进入处理流程前主动拦截异常,而非修复内存越界。

Nginx 本身没有传统缓冲区溢出漏洞,所谓“防护”不是修复内存越界,而是通过预设边界、分层拦截,在恶意或异常请求进入处理流程前就主动拒绝。安全配置的关键是协同控制请求头、请求体、超时与协议行为,而不是盲目调大数值。
请求头缓冲:两级设限,防长头+慢头
请求头攻击常见于超长 JWT、伪造 Cookie 或逐字节发送的 Slow Header 攻击。必须用两级缓冲配合超时:
- client_header_buffer_size 设为 2k 或 4k:作为首道门禁,覆盖典型合法头(如 2KB JWT + 基础追踪头),避免默认 1k 导致正常流量被误拒
- large_client_header_buffers 同步设置,例如 4 8k(总上限 32KB):单 buffer 大小必须 ≥ client_header_buffer_size,否则扩容逻辑不触发,直接 400
- client_header_timeout 5s:从收到第一个字节开始计时,超时即断连,堵住慢速头攻击路径
- underscores_in_headers off:禁用下划线解析,防止 X_Api_Key 绕过鉴权或引发框架歧义
请求体缓冲:按需限制,防大载荷+慢体
大文件上传或分段慢 POST 是内存耗尽主因,防护要落在“判断前拦截”和“缓存中控管”:
- client_max_body_size 按接口设值,例如 50M(文档系统)或 200M(分片上传),放在 location 块中实现精准控制;禁用检查(设为 0)等于放弃防护
- client_body_buffer_size 推荐 2k–8k:小请求走内存,超限自动落临时文件;避免设 64k 以上,否则每个连接预占过多 RSS 内存
- client_body_timeout 10s:收到请求头后开始计时,body 数据中断即断连,防慢速体攻击
- 反向代理场景下,显式关闭 proxy_buffering off 和 proxy_request_buffering off(Nginx 1.16+),避免 body 被重复读取放大内存压力
HTTP/2 与压缩缓冲:协议适配不能漏
启用 HTTP/2 或 Gzip 后,原有头/体限制失效,必须补全对应参数:
- 若 listen 配置了 http2,必须加 http2_max_header_size 32k 和 http2_max_field_size 4k,否则 large_client_header_buffers 不生效
- gzip_buffers 避免默认 32 4k(128KB/连接),高压场景建议 16 8k(128KB 总量但更可控),并配 gzip_min_length 1024 跳过小响应压缩
- 静态资源多时,启用 open_file_cache inactive=30s 加快句柄释放,防 fd 泄漏拖累内存
系统级兜底与可观测性
配置再细也无法替代运行时监控和资源边界控制:
- worker 进程内存受系统 OOM Killer 管控,建议在 systemd 中设置 MemoryMax 和 RestartSec,避免进程被杀后无恢复
- 错误日志中关注 request header or cookie too large 和 client intended to send too large body,这是真实攻击或配置失配的直接信号
- 对登录、Token 刷新等高风险接口,可叠加 limit_req(如 3r/s)防自动化头轰炸











