排查Nginx缓冲区内存问题关键在于识别缓冲是否被不合理填满、被迫落盘或持续增长;90%的“内存溢出”实为配置与流量不匹配导致的资源堆积,需重点检查error.log中upstream sent too big header、client intended to send too large body等错误,并结合ps命令查worker进程RSS、估算单连接缓冲内存占用及临时文件行为。

排查 Nginx 缓冲区相关内存问题,关键不是看“有没有溢出”,而是看“缓冲是否被不合理填满、被迫落盘或持续增长”。真实场景中,90% 的“内存溢出”其实是缓冲配置与业务流量不匹配导致的资源堆积,而非代码级泄漏。
看日志里有没有缓冲触发的典型错误
直接翻 error.log,重点搜这几类线索:
-
upstream sent too big header → 响应头超了
proxy_buffer_size,比如 JWT 或 Cookie 过长 -
client intended to send too large body → 请求体超过
client_max_body_size或client_body_buffer_size - an upstream response is buffered to a temporary file → 响应体撑爆内存缓冲,开始写磁盘临时文件
-
worker process X exited on signal 9 +
dmesg | grep "killed process nginx"确认 → 真 OOM,需结合 RSS 上涨趋势判断是否由缓冲失控引发
查进程内存分布,定位谁在吃内存
别只看 top 总用量。执行这行命令,精准抓 Worker 进程的 RSS(实际物理内存):
ps -o pid,rss,vsz,comm -p $(pgrep -P $(pgrep nginx)) | sort -k2 -nr若某个 Worker RSS 比其他高 2 倍以上,说明它可能:
- 承载了异常多连接(用
ss -tnp | grep :80 | awk '{print $7}' | cut -d',' -f2 | cut -d'=' -f2 | sort | uniq -c | sort -nr查) - 正在处理大量大响应(如导出接口),反复触发
proxy_buffers分配 - 缓存模块(如
proxy_cache、lua_shared_dict)在该进程内预占 slab 页未释放
核对缓冲参数是否超标,按连接数估算
每个活跃连接都会按配置独占缓冲内存。粗略估算单 Worker 最小理论内存占用:
worker_connections × (client_header_buffer_size + large_client_header_buffers + proxy_buffer_size + proxy_buffers总大小) × 0.4–0.5 KB若单 Worker RSS 超过 800 MB,大概率是以下几项设得过大:
-
large_client_header_buffers 4 64k→ 单请求最多占 256 KB,1 万连接就吃掉 2.5 GB -
proxy_buffers 16 128k→ 单连接最多 2 MB,500 连接即破 1 GB -
ssl_session_cache shared:SSL:512m→ 若 QPS 只有 300,按公式 300×600×0.5KB ≈ 90MB,设 512m 就严重冗余 -
client_body_buffer_size 128k→ 上传场景下,每个大 POST 请求都独占一份
观察临时文件和磁盘行为,判断是否“控不住落盘”
临时文件多 ≠ 配置错,但可能是兜底策略失效:
- 检查
proxy_temp_path所在分区空间和 I/O:用df -h和iostat -x 1看是否卡在磁盘写入 - 确认
proxy_max_temp_file_size是否合理:设为 0 会直接 502;设为 2G 且后端返回 5GB 报表,仍会失败 - 临时文件残留?Nginx 不自动清理失败请求留下的 temp 文件,建议加定时任务:
find /var/lib/nginx/proxy -type f -mmin +30 -delete - 路径优化:把
proxy_temp_path、client_body_temp_path指向 SSD 或/dev/shm(内存盘),避开系统盘


















