要让nginx正确处理大文件流式上传,必须关闭proxy_request_buffering(仅在location块中设置),并协同配置client_max_body_size(设于server/http块)、超时参数、proxy_buffering off、http/1.1长连接及后端流式解析能力。

要让 Nginx 通过 ngx_http_proxy_module 正确处理大型文件流式上传,核心不是“加快上传”,而是避免缓存整个文件、实现边收边转。单改一个参数基本无效,必须多项配置协同生效。
必须关闭 proxy_request_buffering
这是最关键的一步,也是最容易被忽略的。Nginx 默认开启该功能(proxy_request_buffering on),会把整个上传体(比如 5GB 视频)先收完、缓存到内存或临时磁盘,再统一发给后端。结果就是上传卡在 99%、首字节延迟高、worker 内存暴涨甚至 OOM。
- 仅在处理上传的
location块中设置:proxy_request_buffering off; - 不能写在
http或server层,否则会影响其他不需要关闭缓冲的接口 - 关闭后,Nginx 不再解析 multipart boundary,也不校验 body,直接以原始字节流 TCP 层转发
client_max_body_size 要设对位置和单位
这是第一道门槛。设错位置或格式,大文件请求根本不会进入 Nginx 处理流程,直接返回 413 错误。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 必须写在
server或http块中,不能放在location里 - 建议值如
client_max_body_size 20G;或2048m;,注意单位大小写敏感(2G无效) - 同步调整后端限制:Spring Boot 的
spring.servlet.multipart.max-file-size、Flask 的MAX_CONTENT_LENGTH等
配套调大超时与禁用响应缓冲
关闭 request buffering 后,数据流变长且不可预测,原有默认超时极易中断;同时,后端返回的进度回调、分块确认等响应也需实时透传。
-
client_body_timeout 3600;:允许弱网下分多次传完一个大文件 -
proxy_read_timeout 3600;和proxy_send_timeout 3600;:匹配后端处理耗时(如校验、转码、落盘) -
proxy_buffering off;:确保响应也能流式返回,避免进度回调被延迟 -
proxy_http_version 1.1;+proxy_set_header Connection '';:维持长连接,防中间设备断连
后端必须能消费原始字节流
Nginx 不缓存、不解析 body,意味着上传数据以原始字节流形式抵达后端。常见框架需显式启用流式读取,不能依赖默认的 multipart 解析。
- Node.js(Express):禁用
body-parser,改用busboy监听req.on('data') - Python(FastAPI/Flask):不调用
request.files,改用request.stream分块读取 - Go(net/http):直接读
req.Body,用io.Copy或分片io.ReadFull处理










