核心是让响应体全程在内存中收发,避免因缓冲不足被迫写临时文件;需按响应特征设proxy_buffers总量(如api用16 128k)、合理配置proxy_busy_buffers_size(取总量1/2且≥单块大小)、禁用临时文件(proxy_max_temp_file_size 0)并验证运行态无“temp file”日志。

核心是让响应体全程在内存中收发,避免因缓冲不足被迫写临时文件。磁盘写入不是性能瓶颈的表象,而是内存配置失配的直接结果。
精准匹配后端响应特征设 proxy_buffers
proxy_buffers 决定 Nginx 能用多少内存暂存后端响应体。默认 8 4k(32KB) 对现代业务基本失效——只要响应超 32KB 就立刻落盘。
- API / HTML / JSON(P95 响应约 100–500KB):用 proxy_buffers 16 128k(总量 2MB),覆盖绝大多数请求,单 worker 内存可控
- 报表导出或镜像拉取(几 MB~百 MB):用 proxy_buffers 32 256k(总量 8MB),但必须同步限并发或改用流式转发
- 流式接口(SSE、分块 JSON、大模型响应):不适用 buffer 缓存,应直接 proxy_buffering off,此时 proxy_buffers 不生效
严格控制“已收未发”数据上限
proxy_busy_buffers_size 不是额外内存,而是从 proxy_buffers 总量里划出的、正在发给客户端的那部分缓冲区上限。设错会导致后端写阻塞或响应延迟。
- 总量为 2MB(如 16 128k)→ 设 proxy_busy_buffers_size 1m
- 总量为 8MB(如 32 256k)→ 设 proxy_busy_buffers_size 4m
- 该值必须 ≥ 单块大小(例如单块 128k,busy 就不能设 64k),否则几轮响应就暂停接收
切断临时文件路径,杜绝隐性 I/O
一旦开始写临时文件,就会污染 page cache、触发内核回写、增加 I/O 等待——这才是响应变慢的根本原因。
- 内存充足且可接受超限失败:直接 proxy_max_temp_file_size 0,超出即返回 502,比默默落盘更利于定位瓶颈
- 必须允许落盘:将 proxy_temp_path 挂载到内存盘(如 /dev/shm/nginx_temp 1 2),并设 proxy_temp_file_write_size 256k,大幅减少小 write() 调用
- 严禁把 proxy_temp_path 和 access_log/error_log 共用同一磁盘分区
验证是否真正绕开磁盘,不靠 reload 靠日志
配置重载成功 ≠ 行为生效。必须观测运行态行为:
- 开启 debug 日志:error_log /var/log/nginx/debug.log debug;
- 上传或请求后搜索关键词:"http client request body buffered"(走内存)或 "temp file"(已落盘)
- 同时检查 error log 是否出现 "could not open temp file" 或 "upstream sent too big header"
- 用 strace 抓系统调用:strace -p $(pgrep nginx) -e trace=openat,write,确认无对临时目录的 openat 调用











