## 症状现象
后台上传稍微大一点的图片或附件,进度条走到一半报错失败:页面提示上传失败,或者干脆收到 413 状态码,小图却一切正常。这是环境配置问题而不是程序 bug:上传链路上的每一环都有默认的大小上限,PHP 有自己的两个限制,Nginx 有请求体限制,谁的门槛最低谁先拦下请求。常见默认值只有两兆上下,稍大的素材就会触顶。
## 三处限制的分工
PHP 侧两个参数是一对:upload_max_filesize 是单个文件的上限,post_max_size 是整个 POST 请求体的上限,后者必须不小于前者,因为表单里除了文件还有别的字段,一次传多个文件时更是叠加计算。在 php.ini 里修改:
upload_max_filesize = 20M post_max_size = 24M
Nginx 侧的门槛是 client_max_body_size,默认值很小,超限直接返回 413,请求根本到不了 PHP。在 http、server 或 location 段按需设置:
nginx client_max_body_size 24m;
三个值就高不就低的原则:Nginx 与 post_max_size 略大于 upload_max_filesize,给表单字段留出余量,任何一环卡住表现都一样,所以要么一起改,要么逐个排查。
## 修改后的生效与验证
php.ini 改完必须重启 PHP-FPM 服务,reload Nginx 让它的配置生效。验证两条路:上传一个略小于新上限的测试文件确认成功;再看 phpinfo 页面或配置查询命令,确认运行中的值确实是新值,改错文件、改了没重启、多份 php.ini 概念混淆(CLI 与 FPM 各一份)是三大高频坑,验证一步都不能省。
## 注意事项
上限别无脑拉大:上传上限放大意味着单请求占用内存与带宽的时间也放大,更容易被滥用成流量攻击入口,按业务真实需要设,二十兆能覆盖多数场景。上传慢导致的失败与大小限制是两回事,那要调超时参数。程序框架可能还有自己的校验层,比如应用配置里的附件大小检查,环境全放开了仍被拦,去程序配置里找。在顺云云服务器上部署 PHP 站点时,把这三个参数写进部署清单,环境迁移时整体核对一遍,这项检查能省掉大部分"换个环境就传不了文件"的工单。