必须关闭proxy_request_buffering,否则Nginx会缓存整个大文件再转发,导致超时、内存暴涨和上传卡顿;同时需配套调大client_max_body_size、延长各类超时时间、关闭proxy_buffering并启用HTTP/1.1长连接。

要让 Nginx 正确代理大文件上传,关键不是“加速上传”,而是让后端能边收边处理——必须关闭 proxy_request_buffering。默认开启时,Nginx 会把整个请求体(比如一个 500MB 的分片)先收全、缓存到内存或磁盘,再一次性转发,这直接导致超时、内存暴涨、首字节延迟高,甚至上传卡在 99%。
哪些场景必须关掉 proxy_request_buffering
以下情况不关就容易失败或不可控:
- 前端使用 tus、web-upload 等协议做分片上传,后端需逐片校验/落盘
- AI 推理服务接收音频流或 chunked JSONL 输入,要求首 chunk 到达即启动计算
- FFmpeg 或 WebRTC 推流接入,后端是实时解封装/转码服务
- IoT 设备持续上报二进制帧,端到端延迟需控制在 200ms 内
- 调试上传链路时出现“后端收不到前几 KB”“连接重置”等现象
只关 proxy_request_buffering 是不够的
单独加一行 proxy_request_buffering off; 很可能仍失败。它只是切换了数据转发模式,但其他环节若没对齐,就会卡在超时、拦截或协议断连上:
-
client_max_body_size 必须设大,如
client_max_body_size 20G;,否则 413 错误会在缓冲关闭前就触发 -
client_body_timeout 要延长,弱网下传一个分片可能耗时数分钟,建议设为
client_body_timeout 3600; - proxy_read_timeout 和 proxy_send_timeout 也需同步调长(如 3600s),覆盖后端处理耗时
- proxy_buffering off; 建议一并关闭,避免响应阶段(如上传进度、元数据)也被缓存阻塞
- proxy_http_version 1.1; 和 proxy_set_header Connection ""; 必须启用,确保长连接不被中间设备意外关闭
配置必须放在 location 块内
这个指令不能只写在 http 或 server 层,否则会影响所有接口。正确写法是针对上传路径精准控制:
location /api/upload {
proxy_pass http://backend;
proxy_request_buffering off;
client_max_body_size 20G;
client_body_timeout 3600;
proxy_read_timeout 3600;
proxy_send_timeout 3600;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
注意:proxy_request_buffering 仅在 Nginx 1.13.10+ 版本可用;旧版本无效。
Kubernetes Ingress 中怎么配
如果你用的是 nginx-ingress-controller,不能改 nginx.conf,必须通过 annotation:
-
nginx.ingress.kubernetes.io/proxy-request-buffering: "off"(值必须是字符串 "off",不是 false 或 0) - 配套加上:
nginx.ingress.kubernetes.io/proxy-body-size: "20Gi"、nginx.ingress.kubernetes.io/client-body-timeout: "3600" - 配置后务必检查 Ingress Controller Pod 日志或生成的 nginx 配置片段,确认是否已生效











