要实现超大文件流式极速转发,必须关闭proxy_request_buffering并成组配置:client_body_buffer_size 0、client_max_body_size 20G、client_body_timeout 600s、proxy_http_version 1.1、proxy_set_header Connection ''、proxy_buffering off;K8s中需用注解nginx.ingress.kubernetes.io/proxy-request-buffering: "off"。

要让超大文件真正实现流式极速转发,关键不是“加快上传速度”,而是让 Nginx 放弃等待完整请求体,改为收到一点就立刻传给后端。这必须关闭 proxy_request_buffering,但它不能单独生效,需成组配置才能稳定、低延迟、不崩溃。
哪些场景必须关掉 proxy_request_buffering
该指令默认为 on,适合普通表单提交;但以下情况必须设为 off:
- 前端用 Vue/React SDK 做断点续传,单个分片达 8–100MB,缓存整片易触发超时或内存溢出
- 直播推流或边缘转码服务(如 FFmpeg 接收原始 MP4 流),后端需逐帧解封装,不能等全部上传完成
- AI 推理服务接收音频 chunk 或 JSONL 分块输入,要求首 chunk 到达即启动计算
- 排查“上传卡在 99%”“后端收不到前几 KB”等问题时,关闭缓冲可暴露真实传输链路行为
核心配置项与协同参数
只写一行 proxy_request_buffering off; 很容易失败。必须同步设置以下几项:
-
禁用请求体内存缓冲:显式添加
client_body_buffer_size 0;(值为 0 表示不分配任何内存缓冲区) -
放宽请求体大小限制:在对应
location中设client_max_body_size 20G;,避免上传中途返回 413 -
延长接收超时时间:设
client_body_timeout 600s;(10 分钟),适配弱网下大文件上传 -
启用 HTTP/1.1 长连接:加上
proxy_http_version 1.1;和proxy_set_header Connection '';,防止连接被代理层意外关闭 -
禁用响应侧缓冲:添加
proxy_buffering off;,避免后端返回的进度状态流被二次积压
Kubernetes Ingress 中的正确写法
若使用 NGINX Ingress Controller,不能改 nginx.conf,必须通过注解配置:
-
nginx.ingress.kubernetes.io/proxy-request-buffering: "off"(注意:值必须是字符串 "off",不能写false或0) - 建议同时配置:
nginx.ingress.kubernetes.io/proxy-body-size: "0"(禁用 body 大小校验上限) - 以及:
nginx.ingress.kubernetes.io/client-body-timeout: "600"
配置后应检查 Ingress Controller Pod 内生成的 nginx 配置片段,确认是否已注入对应指令。
关掉之后 Nginx 的真实行为变化
设为 off 后,Nginx 不再是“中转仓库”,而变成“透明管道”:
- TCP 数据包一到达,立刻转发到 upstream,不暂存在内存或磁盘
- 不再校验
Content-Length是否与实际 body 长度一致(后端需自行处理中断、不完整请求) -
proxy_max_temp_file_size失效,不会写临时文件 - 放弃 Slowloris 类慢速攻击防护能力——这点必须由后端服务或前置 WAF 补位
后端也需配合:例如 Node.js 要调用 req.setTimeout(),Python Flask 要启用 stream=True 并手动迭代读取,否则可能因客户端慢速上传被拖死。


















