NodeJS+Nginx反向代理下使用busboy上传大文件出现413错误如何解决
大文件上传Nginx 413错误无上限解决方案
方法一:直接取消当前接口路径的上传大小限制
Nginx的client_max_body_size参数设置为0时,就会完全关闭请求体大小检查,没有任何硬限制,完全适配无上限大文件上传需求。你当前配置中该参数设为100M,是触发413错误的直接原因。
你可以直接修改location块的配置如下:
location /api { proxy_pass http://host.docker.internal:5000; proxy_pass_header Accept; proxy_pass_header Server; keepalive_requests 1000; proxy_redirect off; proxy_buffering off; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Ssl on; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_connect_timeout 3600; proxy_send_timeout 3600; proxy_read_timeout 3600; send_timeout 3600; # 设为0代表无请求体大小限制 client_max_body_size 0; }
注意:你已经配置了
proxy_buffering off,该配置是流式上传的必要前提,关闭后Nginx不会在本地缓存完整请求体,会直接将收到的字节流实时转发给上游NodeJS服务,不会额外占用磁盘空间,完美匹配busboy的流式处理逻辑。同时建议将超时参数从600秒调大到3600秒甚至更高,避免低带宽场景下上传大文件时超时中断。
方法二:分片上传(更稳定的无上限方案)
如果不想完全放开Nginx的请求体限制,或者需要支持断点续传、上传失败自动重试的能力,可以选择分片上传方案:
- 前端将大文件切分为固定大小的分片(建议单分片大小5-20MB),按顺序/并发上传给后端接口
- 后端接收所有分片后,按分片序号拼接为完整文件
该方案不需要修改Nginx的client_max_body_size默认限制,只要单分片大小小于设置的上限即可,不管多大的文件都可以正常上传,稳定性和容错性更高。
配套校验项
- 确认NodeJS服务端的busboy没有设置
limits.fileSize参数,避免服务端主动截断大文件 - NodeJS对应路由不要启用
express.json()、express.urlencoded()这类会缓冲全量请求体的中间件,直接用busboy处理流式请求即可 - 如果Nginx和上游NodeJS服务部署在不同服务器,确认两地之间的内网带宽足够,避免成为传输瓶颈
内容的提问来源于stack exchange,提问作者Phantom007
相关产品推荐
相关产品推荐

