nginx的client_max_body_size默认为1mb,超限返回413错误,必须在server块内(如listen下方)配置并重载生效;还需同步调整php的upload_max_filesize和post_max_size,并重启php-fpm。

phpEnv里改Nginx的client_max_body_size必须写对位置
phpEnv默认用Nginx做前端,413 Request Entity Too Large错误90%是它先拦的——PHP根本没机会执行。你不能只改PHP配置,必须在Nginx的server块里加client_max_body_size。
常见错误是把这行写进location ~ \.php$里,或者塞到http块顶部。它必须放在站点对应的server { ... }块内,且最好靠近开头(比如listen 80;下面),否则可能被其他配置覆盖。
示例写法:
server {<br> listen 80;<br> server_name example.com;<br> client_max_body_size 500m;<br> ...<br>}
改完别只点“保存”,要手动执行:nginx -t && /www/server/nginx/sbin/nginx -s reload
phpEnv没提供图形化“重载”按钮,不敲命令就等于没生效。
phpEnv中PHP的upload_max_filesize和post_max_size要配对调
phpEnv的PHP配置文件路径通常是/www/server/php/{版本号}/etc/php.ini,不是系统全局的/etc/php.ini。很多人搜错路径,改了也白改。
这两个值必须同时改,且post_max_size ≥ upload_max_filesize(建议大10%~20%,比如前者设500M,后者设550M),否则哪怕传单个文件也会失败——因为POST请求体包含文件+表单字段,总大小超了post_max_size,PHP直接丢弃整个$_FILES和$_POST,连错误都不报清楚。
改完必须重启PHP-FPM:systemctl restart php-fpm-{版本号}
比如php 7.4对应php-fpm-74,php 8.2对应php-fpm-82。只改配置不重启,值永远不变。
phpEnv上传大文件还卡住?检查fastcgi_buffer_size和fastcgi_buffers
当上传文件超过200MB、尤其带SSL或高延迟网络时,Nginx转发给PHP的缓冲区可能溢出,触发413或502。这不是限制值问题,而是传输过程卡死。
在phpEnv的站点Nginx配置里,找到location ~ \.php$块,在fastcgi_pass指令后面加上:
fastcgi_buffer_size 128k;<br>fastcgi_buffers 256 16k;
注意:这两行不能写在server块顶层,必须在location里,且紧挨着fastcgi_pass。否则PHP-FPM收不到完整请求体,Nginx会静默截断并返回413。
另外确认memory_limit不低于上传目标的1.5倍,比如传300MB文件,memory_limit = 450M起步,否则PHP解析过程中OOM退出,Nginx感知为连接中断,也可能伪装成413。
验证是否真生效,别信phpinfo页面的“Loaded Configuration File”
phpEnv里一个坑是:站点绑定了独立PHP配置(通过php.ini软链接或include机制),但phpinfo()显示的Loaded Configuration File路径可能是主配置,实际生效的是子配置。
最可靠验证方式:
– 上传一个刚好比原限制大1MB的文件(比如原来卡在2M,就传2.1MB);
– 用curl -v -F "file=@test.zip" http://yoursite.com/upload.php直连测试,绕过浏览器缓存和JS逻辑;
– 查Nginx错误日志:tail -f /www/wwwlogs/yoursite.error.log,看有没有client intended to send too large body字样。
如果日志里还有这句,说明Nginx层没过;如果没了但$_FILES为空,大概率是post_max_size或upload_max_filesize没同步生效;如果$_FILES['file']['error'] === UPLOAD_ERR_INI_SIZE,那就是PHP层限制还在起作用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











