Nginx上传文件413 Request Entity Too Large解决 Nginx
前言
后台上传图片、附件或视频时,Nginx 返回 413 Request Entity Too Large,文件传不上去。这是 Nginx 的客户端请求体大小限制在拦截,默认通常只有 1MB,而 PHP 也有自己的上传限制,两层都要放开。本文讲解 Nginx 的 client_max_body_size 配置位置、与 PHP upload_max_filesize/post_max_size 的配合,以及验证方法。
操作步骤
1. 在 http 或 server/location 块设置上传大小
http {
client_max_body_size 50m;
}
也可只在某个站点:
server {
client_max_body_size 50m;
}
2. 修改 PHP 上传限制(php.ini)
php --ini
找到 php.ini,修改:
upload_max_filesize = 50M
post_max_size = 55M
post_max_size 要略大于 upload_max_filesize。
3. 重启 PHP-FPM 并重载 Nginx
systemctl restart php-fpm
nginx -t
nginx -s reload
4. 验证 Nginx 限制
curl -X POST -H "Content-Length: 60000000" http://域名/ -o /dev/null -w "%{http_code}\n"
超过限制仍返回 413,未超过则不报错。
5. 宝塔面板用户
站点设置 → 配置文件里直接加 client_max_body_size,或在上传限制选项里调整,同时改 PHP 上传大小。
常见坑
- 只改了 Nginx,PHP 的 upload_max_filesize 仍为 2M,文件传到一半被 PHP 拒绝。
- post_max_size 小于 upload_max_filesize,上传永远超限。
- client_max_body_size 写在错误层级,被上层默认值覆盖。
- 改完 php.ini 没重启 php-fpm,参数不生效。
- 云服务器或 CDN 还有上传大小限制,Nginx 放开了但中间层拦截。
- 大文件上传还需要调整超时时间,避免传输过程中断。
- 单位大小写注意,m 和 M 均可,不要写成 mb。
总结
413 的解决是两层联动:Nginx 的 client_max_body_size 放开上限,PHP 的 upload_max_filesize 和 post_max_size 同步放大,再重启 php-fpm、重载 Nginx。CDN 和云网关的限制要单独确认。上传功能上线前用超限文件实测,确认两层都不拦截。
遇到问题加QQ23979811 协助处理