Nginx警告日志表明上游响应部分写入磁盘临时文件,本质是IO路径从内存降级至磁盘,需通过调优proxy_/fastcgi_/client_body_*等缓冲参数,使常见响应尽量走内存缓冲,并合理管控临时文件行为。

这个日志不是错误,而是 Nginx 发出的警告,说明它把上游响应的一部分写进了磁盘临时文件,而不是全存在内存里。本质是 IO 路径从内存降级到了磁盘,频繁出现会拖慢响应、增加磁盘负载。调优目标很明确:让常见响应尽量走内存缓冲,减少临时文件读写。
看日志定位瓶颈类型
先别急着改参数,打开 error.log 找规律:
- 如果日志里反复出现同一类 URL(比如 /api/report、/export/pdf),说明是特定大响应触发的,重点调 proxy_* 缓冲
- 如果伴随 “client request body is buffered” 提示,说明是上传请求导致的,要查 client_body_* 配置
- 如果路径含 fastcgi://,说明用的是 PHP-FPM 或类似 FastCGI 后端,得调 fastcgi_* 系列参数
- 如果临时文件路径如 /var/cache/nginx/proxy_temp/1/00/0000000001 所在分区空间紧张或 I/O 延迟高,先清理或换盘
针对性扩大内存缓冲区
根据后端协议选对参数组,避免“一刀切”:
-
反向代理(HTTP upstream):在 http/server/location 块中加
proxy_buffer_size 128k;
proxy_buffers 64 64k;
proxy_busy_buffers_size 512k;
proxy_temp_file_write_size 512k;
总缓冲容量 = 64 × 64KB = 4MB,足够应付多数 HTML/API 响应 -
FastCGI(如 PHP):对应改为
fastcgi_buffer_size 128k;
fastcgi_buffers 64 64k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 512k; -
上传大文件场景:补充
client_max_body_size 2G;
client_body_buffer_size 10m;
防止请求体本身也落盘
控制临时文件行为
即使调大了内存缓冲,极端情况仍需落盘。这时要管好磁盘侧:
- 确认 proxy_temp_path(默认 /var/cache/nginx/proxy_temp)所在磁盘有足够空间且权限正确:
sudo chown -R nginx:nginx /var/cache/nginx/proxy_temp - 限制单个请求最多能写多大临时文件,防雪崩:
proxy_max_temp_file_size 1024m; - 若业务允许(如下载、流式接口),可直接关闭缓冲:
proxy_buffering off;
此时响应边收边发,不缓存,彻底避开该日志
验证与观察
改完配置后 reload,不要重启:
- 用 curl -s -w "%{size_download}\n" -o /dev/null http://your-api 粗略看响应体大小
- 持续观察 error.log,确认警告是否明显减少;再用 iostat -x 1 查看 %util 和 await 是否下降
- 注意别盲目堆大缓冲——128 个 128KB 缓冲(16MB)对小站反而浪费内存,按实际响应 P95 大小上浮 20% 设置更稳妥


















