413错误根本由nginx在请求入口拦截,非php报出;必须优先配置client_max_body_size(如2048m)于server块内,并重载nginx,否则php调优无效。

413 Request Entity Too Large 错误根本不是 PHP 报的,是 Nginx 在请求进门时就拦下了——改 PHP 配置完全没用,必须先动 client_max_body_size。
为什么改了 PHP 还是 413?Nginx 拦在最前面
Nginx 默认只允许 1MB 的请求体,超过就直接返回 413 Request Entity Too Large,压根不把请求转发给 PHP。所以哪怕你把 upload_max_filesize 改成 10G,上传按钮一点,浏览器 Network 标签里立刻看到 413 响应,PHP 进程日志里连一条记录都不会有。
-
client_max_body_size必须加在站点配置的server { }块内,不能塞进location或http块 - 单位必须是小写
m(例如2048m),写成2048M或2048MB会被 Nginx 忽略 - 改完配置后,必须点宝塔右上角「重载配置」,或手动执行
nginx -t && systemctl reload nginx;只点「保存」不生效 - 如果用域名 + HTTPS 访问宝塔面板本身(比如
https://panel.example.com),那这个域名对应的网站配置里也得加一遍client_max_body_size,否则文件管理器的上传请求会在反代层就被截掉
上传失败但没报 413?检查宝塔面板自身的硬编码限制
宝塔 v7.9.0+ 在后台服务里内置了独立的上传上限,和 Nginx、PHP 完全无关,只管「文件管理器」界面里的拖拽/点击上传。默认是 100MB,哪怕 Nginx 和 PHP 全放开,传 101MB 就会弹窗提示「上传大小超出限制」之类。
- 编辑配置文件:
vim /www/server/panel/data/config.json - 查找
"upload_max_size"字段;若不存在,就在 JSON 根对象第一层新增一行:"upload_max_size": 2048,(注意逗号位置,确保 JSON 合法) - 保存后必须执行
bt restart,仅刷新页面或重载 Nginx/PHP 无效 - 该设置不影响网站表单、API 接口或 phpMyAdmin 导入,只作用于面板「文件」页的上传功能
PHP 层要同步调,但必须满足两个硬条件
过了 Nginx 和宝塔面板这两关,PHP 才真正开始干活。但它自己也有两道闸:一是单个文件上限 upload_max_filesize,二是整个 POST 请求总容量 post_max_size。后者必须 ≥ 前者,否则哪怕只传一个文件也会被拒绝,报错 UPLOAD_ERR_INI_SIZE。
- 进「软件管理」→ 找到对应 PHP 版本 → 「设置」→ 「配置修改」
- 确认这两行都存在且值合理(推荐统一设为
2048M,注意单位是大写M):upload_max_filesize = 2048Mpost_max_size = 2048M - 检查网站根目录下是否存在
.user.ini文件,它可能覆盖全局 PHP 配置;如有,删掉里面关于这两个参数的行 - 改完必须点「重载PHP」,不是「保存」——PHP 进程不重启,新配置永远不会加载
最容易被忽略的是三层限制的生效范围不同:宝塔 config.json 只管面板文件管理器,client_max_body_size 管所有发往该站点的 HTTP 请求体,而 PHP 参数只影响经由 FastCGI 转发给它的那些请求。传不上去时,先看浏览器 Network 里响应状态码,再查 Nginx error.log 和面板 /www/server/panel/logs/request.log,比盲目调参数快得多。











