nginx 不支持 http/1.1 分块传输编码处理 multipart/form-data 上传,需关闭 proxy_request_buffering、合理设置 client_max_body_size 和超时参数,确保分片请求透传不缓存。

Nginx 本身不主动启用 HTTP/1.1 的 Chunked Transfer Encoding(分块传输编码)来处理文件上传,尤其对 multipart/form-data 类型的上传请求。它默认期望客户端在发送请求前就明确告知 Content-Length —— 这是上传能被正常接收的前提。所谓“分块上传”,在浏览器端实际指前端将大文件切片、逐个发起独立 POST 请求(带 slice index、total 等元信息),而 Nginx 的角色是正确透传这些请求,不缓存、不截断、不限制、不超时。
要让 Nginx 支持这种分片上传场景,关键不是开启 chunked_transfer_encoding,而是确保:
✅ 正确配置 client_max_body_size
防止 Nginx 在第一关就拒绝分片请求(每个分片虽小,但若设得太小仍可能被拦):
server {
client_max_body_size 128m; # 比单个分片略大即可,如你分片 5MB,设 10M 更稳妥
# 不要写在 location 里!否则无效
}
✅ 关闭 proxy_request_buffering(仅限上传 location)
这是最易出错的一环。Nginx 默认会把整个请求体(包括 multipart boundary 和所有分片数据)先收全再转发,导致:
- 分片请求卡在 99%,响应延迟极高
- worker 内存暴涨,甚至 OOM
必须在具体上传路径中关闭:
location /upload/chunk {
proxy_pass http://backend;
proxy_request_buffering off; # ⚠️ 必须在此处关闭,且只针对上传路径
# 同时调大超时,适应弱网或慢后端
client_body_timeout 3600;
proxy_read_timeout 3600;
proxy_send_timeout 3600;
}
✅ 允许 multipart 请求头与长字段
确保 Nginx 不因 header 过长或特殊字段拒绝请求:
client_header_buffer_size 4k; large_client_header_buffers 4 16k; client_max_body_size 128m; # 显式允许 multipart/form-data(虽然默认支持,但显式更稳) underscores_in_headers on; # 若前端用 x-upload-id 这类带下划线的自定义头
✅ 配置临时文件路径(可选但推荐)
当分片内容超出内存缓冲(client_body_buffer_size),Nginx 会落盘。需确保路径可用:
client_body_temp_path /var/tmp/nginx/upload 1 2; # 创建目录并授权:mkdir -p /var/tmp/nginx/upload && chown nginx:nginx /var/tmp/nginx/upload
不需要也不建议开启 chunked_transfer_encoding on —— 它主要服务于动态响应生成(如后端流式输出),与前端分片上传无关;反而可能干扰 multipart 解析逻辑。真正的“分块”发生在业务层(前端切片 + 后端合并),Nginx 只需做干净、低延迟、高容错的管道。











