跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Nginx反向代理文件上传的配置 proxy_pass和请求体大小

后端收不到完整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 是否正确。比如: Comet AI 浏览器 下载 Comet AI 浏览器,体验由 Perplexity AI 驱动的革命性上网方式。内置 AI 助手可实时总结网页、跨标签页对比信息、自动执行任务。告别繁琐操作,让 AI 成为你的浏览副驾,大幅提升研究与工作效率。支持 Windows、macOS、Android 和 iOS。 下载
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 Nginx 对文件上传的控制点比看起来多:从接收(
client_max_body_size
)、缓冲(
proxy_buffering
)、转发路径(
proxy_pass
斜杠)、到超时(
proxy_read_timeout
),任一环节没对齐,上传就会静默失败或中断。最容易漏的是
proxy_buffering off
和
proxy_read_timeout
配合——尤其当后端明确支持分块上传却始终卡在 60 秒时。

相关文章