Beego 项目在 Nginx 前置时上传大文件失败,主因是 Nginx 与 Beego 的超时及大小限制未同步;需同时调整 Nginx 的 client_max_body_size 和 Beego 的 MaxMemory、MaxUploadSize 配置。

Beego 项目在 Nginx 前置时上传大文件失败,90% 是因为 Nginx 和 Beego 两层超时与大小限制没对齐,不是单改一个 client_max_body_size 就能解决的。
Beego 的 upload 配置必须显式放开
Beego 默认对 multipart 请求体有硬性拦截:即使 Nginx 放开了,Beego 仍会拒绝超过 MaxMemory 或 MaxUploadSize 的请求。它不读取 PHP 那类 ini 设置,所有限制都在代码或配置文件里。
-
MaxMemory控制内存缓冲上限(单位字节),默认64 (64MB),超出会写临时文件;设为 <code>0表示不限内存缓冲(慎用) -
MaxUploadSize是总请求体大小上限(含所有字段+文件),单位字节,**必须 ≥ Nginx 的client_max_body_size**,否则直接返回 400 - 在
conf/app.conf中配:MaxMemory = 104857600 # 100MB MaxUploadSize = 2147483648 # 2GB
- 若用代码初始化(如
bee run启动前),需调用beego.BConfig.MaxMemory和beego.BConfig.MaxUploadSize
Nginx location 块里必须单独配 client_max_body_size
不能只在 http 或 server 块里全局设——Beego 的上传接口路径(比如 /api/upload)往往和普通 API 混在一个 server 下,全局放宽会扩大攻击面。
- 匹配 Beego 上传路由的
location必须显式声明:location /api/upload { client_max_body_size 2g; client_body_timeout 600; proxy_pass http://backend; } - 单位必须小写:
2g✅,2G或2gb❌(Nginx 会静默忽略或报错) - 如果 Beego 运行在本地(
proxy_pass http://127.0.0.1:8080),还要确认该端口未被防火墙或 SELinux 拦截
proxy_read_timeout 要按 Beego 实际处理时间设,不是拍脑袋填 3600
Beego 处理大文件常涉及解压、校验、分块入库等操作,响应不是“立刻吐出”,proxy_read_timeout 设短了就会 504;设太长又拖住 worker。它和 Beego 的 RunMode 和业务逻辑强相关。
- 先用
curl -w "@format.txt" -o /dev/null -s http://localhost:8080/api/upload测 Beego 单机 P95 响应时间(format.txt含%{time_starttransfer}) - 若测出是 210s,就设
proxy_read_timeout 252;(+20% 余量) - 流式上传(如边收边转码)必须关缓冲:
proxy_buffering off;,否则 Nginx 会等整个响应结束才发回,导致前端卡死 - 别漏掉
proxy_connect_timeout 15;和proxy_send_timeout 60;,它们影响连接建立和请求下发,但一般不用拉得比read更长
容易被忽略的磁盘与权限细节
Beego 接收大文件时,Nginx 先存临时文件再转发,这个过程失败不会报 413 或 504,而是静默 500 或日志里出现 open() "/tmp/nginx/client_body/..." failed (13: Permission denied)。
- 确认
client_body_temp_path目录存在且 Beego 进程用户(如www-data)有读写权限:sudo mkdir -p /var/tmp/nginx/client_body sudo chown www-data:www-data /var/tmp/nginx/client_body sudo chmod 755 /var/tmp/nginx/client_body
- 在 Nginx 配置中显式指定该路径,避免落到默认
/tmp(可能被 systemd-tmpfiles 清理):client_body_temp_path /var/tmp/nginx/client_body 1 2;
- Beego 的
UploadDir(保存最终文件的位置)也要确保磁盘空间够、权限可写,否则上传成功但保存失败,前端看到“200”却找不到文件


















