必须关闭proxy_request_buffering并协同配置client_max_body_size、超时及缓冲参数,才能实现大文件边收边传;单改一项无效,且proxy_request_buffering须在location块中关闭,client_max_body_size应设于server块防413。

要让 Nginx 正确代理大文件上传,核心不是“加速传输”,而是确保请求体能边接收、边转发给后端,避免全量缓存导致超时或内存溢出。关键配置必须协同生效,单改一项往往无效。
必须关闭 proxy_request_buffering
这是最常被忽略却最关键的一环。Nginx 默认开启该功能,会把整个上传文件(比如 2GB 视频)先收完、缓存到内存或磁盘,再发给后端——这直接造成上传卡在 99%、首字节延迟高、worker 内存暴涨甚至 OOM。
- 仅在需要上传的 location 块中关闭:proxy_request_buffering off;
- 不能写在 http 或 server 层,否则会影响所有接口
- 典型适用场景:tus 分片上传、AI 流式音频输入、FFmpeg 推流、IoT 持续帧上报
client_max_body_size 要设在 server 或 http 块
它决定 Nginx 是否允许这个请求进入,是第一道门槛。如果放错位置(如写在 location 里),大文件请求根本不会走到 proxy_pass,直接返回 413 错误。
- 推荐写在 server 块内,例如:client_max_body_size 20G;
- 单位注意大小写:支持 m、M、g、G,但不识别 2G(缺空格或单位格式错误)
- 同时必须同步调整后端限制(如 Spring Boot 的 max-file-size、Flask 的 MAX_CONTENT_LENGTH)
配套调大超时与缓冲参数
关闭缓冲后,数据流变长且不可预测,原有默认超时(60 秒)极易中断上传。
- client_body_timeout 3600; —— 允许客户端分多次传完一个大文件(弱网下很关键)
- proxy_read_timeout 3600; 和 proxy_send_timeout 3600; —— 匹配后端处理耗时(如校验、转码、落盘)
- proxy_buffering off; —— 避免响应阶段(如上传进度回调)也被缓存阻塞
- proxy_http_version 1.1; + proxy_set_header Connection ""; —— 维持 HTTP/1.1 长连接,防中间设备断连
临时文件与磁盘路径要可控
当上传体超过 client_body_buffer_size(建议设 128k~512k),Nginx 会写临时文件。若路径不可写或空间不足,上传直接失败。
- 显式指定:client_body_temp_path /var/tmp/nginx/client_body 1 2;
- 确保该目录存在、nginx worker 用户可写、磁盘剩余空间 ≥ 最大预期上传文件
- 不要盲目调大 client_body_buffer_size,内存压力比磁盘更敏感











