后端收不到完整body是因为Nginx在proxy_pass前就因client_max_body_size限制(默认1MB)返回413,需同时调大该值、关闭proxy_buffering或调大缓冲区,并匹配proxy_pass斜杠规则及协同调大proxy_read_timeout等超时参数。

proxy_pass 转发文件上传请求时,为什么后端收不到完整 body?
因为 Nginx 默认限制客户端请求体大小为 1MB,超过就直接返回 413 Request Entity Too Large,根本不会走到 proxy_pass。这不是转发逻辑问题,而是 Nginx 在代理前就拦截了。
必须同时设置 client_max_body_size 和 proxy_buffering
上传大文件时,仅调大 client_max_body_size 不够,还需关闭缓冲或调大缓冲区,否则 Nginx 会把整个上传体缓存在内存/临时文件中,拖慢响应甚至触发超时。
-
client_max_body_size放在http、server或location块里均可,建议写在location中更精准,例如:location /upload/ { client_max_body_size 100m; proxy_pass http://backend; } - 关闭代理缓冲(推荐上传场景):
proxy_buffering off;
否则 Nginx 会等整个文件传完才转发,后端无法流式接收 - 若必须开启缓冲(如需重试),则需同步调大:
proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 512k;
注意 proxy_pass 末尾斜杠与后端路径拼接规则
这直接影响上传接口 URL 是否正确。比如:
-
proxy_pass http://127.0.0.1:8000/;(末尾有/)→location /upload/中的/upload/file会被重写为/file -
proxy_pass http://127.0.0.1:8000;(无/)→ 原路径透传,/upload/file就变成/upload/file,后端必须匹配该路径 - 上传接口常带路径参数(如
/api/v1/upload?token=xxx),斜杠误配会导致 query string 丢失或 404
超时配置不匹配会导致连接被重置
文件上传耗时长,Nginx 默认 proxy_read_timeout 是 60 秒,后端还没处理完,Nginx 就断开了连接,浏览器看到 net::ERR_CONNECTION_RESET。
- 关键三项要协同调大:
proxy_connect_timeout 60; proxy_send_timeout 300; proxy_read_timeout 300;
-
proxy_send_timeout控制 Nginx 向后端发送 body 的超时(非整个上传,而是两次写之间的间隔) -
proxy_read_timeout控制等待后端响应的超时,上传完成后的响应也受它约束 - 如果后端是 Python Flask/FastAPI 或 Node.js,也要检查其自身请求超时设置,不能只调 Nginx
client_max_body_size)、缓冲(proxy_buffering)、转发路径(proxy_pass 斜杠)、到超时(proxy_read_timeout),任一环节没对齐,上传就会静默失败或中断。最容易漏的是 proxy_buffering off 和 proxy_read_timeout 配合——尤其当后端明确支持分块上传却始终卡在 60 秒时。










