后端收不到完整body是因为Nginx在proxy_pass前就因client_max_body_size限制(默认1MB)返回413,需同时调大该值、关闭proxy_buffering或调大缓冲区,并匹配proxy_pass斜杠规则及协同调大proxy_read_timeout等超时参数。
proxy
_pass 转发文件上传请求时,为什么后端收不到完整 body?
因为 Nginx 默认限制客户端请求体大小为 1MB,超过就直接返回
,根本不会走到
。这不是转发逻辑问题,而是 Nginx 在代理前就拦截了。
必须同时设置 client_max_body_size 和 proxy_buffering
上传大文件时,仅调大
不够,还需关闭缓冲或调大缓冲区,否则 Nginx 会把整个上传体缓存在内存/临时文件中,拖慢响应甚至触发超时。
放在
、
或
块里均可,建议写在
中更精准,例如:
关闭代理缓冲(推荐上传场景):
否则 Nginx 会等整个文件传完才转发,后端无法流式接收
若必须开启缓冲(如需重试),则需同步调大:
注意 proxy_pass 末尾斜杠与后端路径拼接规则
这直接影响上传接口 URL 是否正确。比如:
Comet AI 浏览器
下载 Comet AI 浏览器,体验由 Perplexity AI 驱动的革命性上网方式。内置 AI 助手可实时总结网页、跨标签页对比信息、自动执行任务。告别繁琐操作,让 AI 成为你的浏览副驾,大幅提升研究与工作效率。支持 Windows、macOS、Android 和 iOS。
下载
(末尾有
)→
中的
会被重写为
(无
)→ 原路径透传,
就变成
,后端必须匹配该路径
上传接口常带路径参数(如
),斜杠误配会导致 query string 丢失或 404
超时配置不匹配会导致连接被重置
文件上传耗时长,Nginx 默认
是 60 秒,后端还没处理完,Nginx 就断开了连接,
浏览器
看到
。
关键三项要协同调大:
控制 Nginx 向后端发送 body 的超时(非整个上传,而是两次写之间的间隔)
控制等待后端响应的超时,上传完成后的响应也受它约束
如果后端是 Python Flask/FastAPI 或 Node.
js
,也要检查其自身请求超时设置,不能只调 Nginx
Nginx 对文件上传的控制点比看起来多:从接收(
)、缓冲(
)、转发路径(
斜杠)、到超时(
),任一环节没对齐,上传就会静默失败或中断。最容易漏的是
和
配合——尤其当后端明确支持分块上传却始终卡在 60 秒时。
413 Request Entity Too Largeproxy_passclient_max_body_sizeclient_max_body_sizehttpserverlocationlocationlocation /upload/ {
client_max_body_size 100m;
proxy_pass http://backend;
}proxy_buffering off;proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 512k;proxy_pass http://127.0.0.1:8000/;/location /upload//upload/file/fileproxy_pass http://127.0.0.1:8000;//upload/file/upload/file/api/v1/upload?token=xxxproxy_read_timeoutnet::ERR_CONNECTION_RESETproxy_connect_timeout 60;
proxy_send_timeout 300;
proxy_read_timeout 300;proxy_send_timeoutproxy_read_timeoutclient_max_body_sizeproxy_bufferingproxy_passproxy_read_timeoutproxy_buffering offproxy_read_timeout