nginx内存非线性增长主因是请求类型、缓冲策略、连接生命周期和配置结构四类因素组合效应:短请求耗2–5mb/worker,大报文可致单worker超50mb;client_body_buffer_size等参数为分配基线,设1m配3000并发即预占3gb;未开upstream keepalive时每秒万请求数导致连接无法复用,内存脉冲式上涨;千个server块可使每个worker多占200–400mb。

看请求类型:短请求 vs 长时大报文,内存压强差十倍
短请求(如静态资源、轻量 API)单次内存占用通常在 2–5MB/worker;而长时大报文请求(如 10MB 文件上传、视频流转发)在 proxy_request_buffering on 且 client_body_buffer_size 不足时,可能瞬时拉升单 worker 内存至 50MB+。
- 高频小请求:内存消耗平缓,主要来自连接结构体 + header 缓冲,易被忽略但总量可观
- 低频大请求:内存峰值尖锐,集中在 body 读取阶段,容易触发临时文件落盘和 page cache 暴涨
- 长连接保活请求(如 SSE、WebSocket):不占 body 缓冲,但每个连接持续持有 socket 缓冲 + SSL 上下文,内存呈“底座式”缓慢抬升
盯缓冲区配置:一个参数改错,内存曲线立刻陡峭
client_body_buffer_size 和 large_client_header_buffers 是内存趋势最敏感的两个开关。它们不是“最大值限制”,而是“分配基线”——Nginx 会按配置值预分配内存块,哪怕实际请求体只有几百字节。
- 设为
1m,3000 并发上传 → 至少 3GB 内存被预留(非实时占用,但可立即触发 OOM Killer) - 设为
2k,但 P99 请求头达 3.8KB → 触发多次 realloc + 内存碎片,RSS 反而比设成4k更高 - 建议按真实流量分布设值:用 access_log 中
$request_length统计 P95/P99,再乘以 1.25 安全系数反推 buffer 下限
查连接与上游行为:keepalive 不开,内存悄悄翻倍
未启用 upstream keepalive 时,每秒 1 万请求 ≈ 每秒新建 1 万个 TCP 连接。每个连接至少消耗:
- 内核 socket 缓冲:4–8KB
- Nginx proxy buffer:默认
proxy_buffer_size 4k+proxy_buffers 8 4k= 36KB/连接 - SSL 握手上下文(HTTPS):额外 10–20KB
这些开销在短连接场景下无法复用,导致内存随 QPS 持续脉冲式上涨。开启 keepalive 200 后,连接复用率可达 95%+,worker RSS 曲线明显趋平。
验配置结构:server 块数量,是隐形内存放大器
每个 server{} 块在每个 worker 进程中都完整驻留一份解析后的指令树。1000 个 HTTPS server 块,即使内容高度重复,也会让每个 worker 多吃 200–400MB 内存(含 SSL 证书副本、日志上下文、location 树等)。
- 合并域名到同一 server 块(SNI 支持),减少 70%+ server 实例
- 把
ssl_session_cache提到 http 块,避免每个 server 单独建 1MB 缓存 - 关闭所有非关键域的
access_log,日志上下文是 per-server 分配的











