本文从 Obsidian 撰写发布
宝塔 Nginx 上传文件 413 错误排查教程
一、问题现象
- 上传文件超过 50MB 时失败
- 页面提示 413 Request Entity Too Large
- 小于 50MB 的文件可以正常上传
二、排查思路
文件上传请求通常要经过多层服务,任何一层的请求体大小限制都可能导致 413:
浏览器 → 宝塔 Nginx(反代)→ 应用容器 → 应用框架核心原则:从最外层开始,逐层确认请求是否到达,定位到真正返回 413 的那一层。
三、定位过程
1. 查看 Nginx 最终生效的配置
nginx -T 2>/dev/null | grep -n "client_max_body_size"如果输出类似:
36: client_max_body_size 50m;说明 Nginx 里有一处 50m 的限制,与“超过 50M 失败”的现象吻合。
2. 确认限制来自哪个配置文件
# 查看宝塔站点的 extension 扩展配置
ls -l /www/server/panel/vhost/nginx/extension/<你的域名>/
cat /www/server/panel/vhost/nginx/extension/<你的域名>/*.conf
# 查看宝塔全局 nginx.conf
grep -n "client_max_body_size" /www/server/nginx/conf/nginx.conf本例中,全局 /www/server/nginx/conf/nginx.conf 第 35 行有 client_max_body_size 50m;,它会在所有站点生效。
3. 确认应用容器本身是否有限制
查看应用日志,确认超过 50MB 的请求是否能到达应用:
docker logs -f <应用容器名>如果日志里能看到 50MB 以上文件成功入库的记录,说明应用层没有问题,413 来自它前面的代理。
四、解决方案
不要直接改全局配置(会影响服务器上所有站点)。推荐在需要大文件上传的站点里单独覆盖。
1. 打开站点配置文件
宝塔面板 → 网站 → 找到对应站点 → 设置 → 配置文件
2. 添加站点级配置
在 server { } 块内,server_name 下面加一行:
client_max_body_size 200m;注意:
- 单位用小写
m,写200M可能被 Nginx 忽略- 数值按需调整,
200m只是示例
3. 校验并重载
nginx -t && systemctl reload nginx4. 验证生效
nginx -T 2>/dev/null | grep -n "client_max_body_size"应能看到两行:
36: client_max_body_size 50m; # 全局(被覆盖)
470: client_max_body_size 200m; # 站点级(生效)Nginx 规则:同一 server 块内,站点级配置优先于全局配置。访问该域名时生效的是 200m。
五、验证结果
刷新页面,重新上传之前失败的文件,上传成功。
六、关键要点
| 要点 | 说明 |
|---|---|
| 逐层排查 | 上传失败不一定是应用的问题,要从最外层代理开始查 |
| 看日志定位 | 应用日志里能看到成功的大文件上传,说明问题在代理层 |
| 优先改站点 | 在站点配置里覆盖,不改全局,避免影响其他站点 |
| 单位写法 | 用小写 m,写 M 可能不生效 |
| 持久化 | 宝塔站点配置会自动持久保存,重启不会丢失 |
七、常用排查命令速查
# 查看 Nginx 最终生效配置里的请求体限制
nginx -T 2>/dev/null | grep -n "client_max_body_size"
# 查看宝塔全局配置
grep -n "client_max_body_size" /www/server/nginx/conf/nginx.conf
# 查看站点 extension 扩展配置
cat /www/server/panel/vhost/nginx/extension/<域名>/*.conf
# 校验并重载 Nginx
nginx -t && systemctl reload nginx
# 实时查看应用容器日志
docker logs -f <容器名>八、注意事项
- 如果站点配置里存在多个
client_max_body_size,Nginx 会以最后出现的为准 - 如果改完站点级配置仍然 413,检查前面是否还有 CDN、WAF 或云负载均衡,它们也有各自的请求体限制
- 应用框架本身(如 PHP 的
upload_max_filesize、post_max_size)也可能有限制,需一并检查
暂无评论
还没有评论,来说点什么吧