关闭 proxy_request_buffering 是优化超大文件上传内存占用最直接有效的手段,因其使 Nginx 边收边转请求体,避免整体会话体缓存,内存占用恒定且与文件大小无关。

关闭 proxy_request_buffering 是优化超大文件上传内存占用最直接有效的手段。默认开启时,Nginx 会把整个上传请求体(比如几个 GB 的视频)先完整读入内存或磁盘临时文件,再转发给后端——这不仅吃内存、占磁盘,还拖慢首字节响应,甚至触发 OOM 或写满临时目录。
为什么 proxy_request_buffering off 能显著降内存
开启时:Nginx 必须等客户端发完全部数据(含网络延迟、重传),才能开始向后端发送;期间所有数据暂存在 client_body_buffer_size(默认仅 8k~16k)或落盘到 client_body_temp_path;大文件极易溢出缓冲,频繁刷盘,内存+IO 双压力。
关闭后:Nginx 变成“边收边转”,收到一块就发一块,不缓存整体会话体;内存占用基本恒定(仅维持 TCP 窗口和少量协议头),与文件大小无关。
阿里百炼大模型平台多人共享账号用量统计代理服务。解决公司共用账号时无法区分个人用量的问题。适用场景:1)部署用量统计代理;2)统计多人Token用量和调用次数;3)管理大模型API调用配额。
关键配置项必须同步调整
-
显式关闭请求缓冲:在
location块中设置proxy_request_buffering off;(注意不是proxy_buffering,后者控制响应转发) -
放宽上传体限制:
client_max_body_size 0;或设为具体值(如20G),否则 413 错误会在缓冲前就拦截 -
延长等待超时:上传耗时长,必须调大
client_header_timeout(请求头)、client_body_timeout(请求体接收间隔)和proxy_read_timeout(后端响应等待);建议均设为3600s或更高 -
确认临时路径可用:即使关闭 buffering,Nginx 仍可能在极少数场景(如 SSL 解密后重构造)用到
client_body_temp_path;确保该路径挂载在 SSD、空间充足、inode 富余
典型 location 配置示例
专用于上传接口(如 /upload 或 /api/v1/files):
location /api/upload {
proxy_pass http://backend;
proxy_request_buffering off;
client_max_body_size 20G;
client_header_timeout 3600;
client_body_timeout 3600;
proxy_read_timeout 3600;
proxy_send_timeout 3600;
<pre class='brush:php;toolbar:false;'># 透传关键头部(如 Range、If-Range),支持断点续传
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
注意事项与验证方法
- 关闭后,后端服务需能处理流式请求体(如用
php://input、req.body流读取,而非依赖$_FILES) - 不再具备“上传完成后再校验”的能力(如文件大小预检),需由后端或前置鉴权服务承担
- 验证是否生效:上传中观察 Nginx 进程 RSS 内存是否稳定(
ps aux --sort=-rss | head -5);同时抓包确认请求体是否持续流式发出(Wireshark 过滤http.request.uri contains "upload") - Kubernetes Ingress 用户:通过注解
nginx.ingress.kubernetes.io/proxy-request-buffering: "off"启用,值必须是字符串

















