Nginx的client_max_body_size默认1MB导致413错误,需在server或location块中设置如client_max_body_size 128m;,并同步调高fastcgi_read_timeout、禁用buffering,同时检查CDN/网关层限制。

如果您在使用ThinkPHP时遇到文件上传失败,且浏览器返回413 Request Entity Too Large错误,则问题极可能出在Nginx对请求体大小的硬性拦截。以下是解决此问题的步骤:
一、配置client_max_body_size参数
该指令控制Nginx允许接收的整个HTTP请求体最大字节数,包括文件二进制数据、表单字段及multipart边界符。若未显式设置,Nginx默认仅允许1MB,任何超出都将被直接拒绝,PHP和ThinkPHP均无法介入处理。
1、打开Nginx对应站点的server配置块(非http全局块)。
2、在server或location上下文中添加指令:client_max_body_size 128m;。
立即学习“PHP免费学习笔记(深入)”;
3、确保该值不小于PHP侧post_max_size(建议多留5–10MB余量)。
4、执行nginx -t验证语法正确性。
5、执行nginx -s reload重载配置。
二、检查反向代理与网关层限制
当Nginx作为反向代理部署在CDN、SLB或ALB之后时,上游网关可能独立设置了请求体上限,该限制优先于Nginx生效,导致413错误但Nginx访问日志无记录。
1、确认当前架构中是否存在CDN(如Cloudflare)、云负载均衡器(如阿里云SLB、腾讯云CLB)。
2、登录对应平台控制台,查找“请求体大小限制”、“max request body”或“client_max_body_size”类配置项。
3、将该值设为不低于Nginx的client_max_body_size。
4、保存并发布网关配置。
三、调整Nginx超时相关参数
大文件上传耗时较长,若fastcgi_read_timeout过短,Nginx会在PHP尚未完成处理前主动断开连接,表现为上传中断、504 Gateway Timeout或静默失败。
1、在server或http块中定位fastcgi参数段。
2、设置fastcgi_read_timeout 600;(单位秒,建议≥600)。
3、同步检查client_header_timeout和client_body_timeout,均建议设为120或更高。
4、如使用proxy_pass转发至PHP-FPM,还需确认proxy_read_timeout与之匹配。
四、验证Nginx是否真正放行请求
即使配置已修改,仍需验证Nginx是否实际接收并转发了大体积请求体。若Nginx日志中出现413错误而PHP错误日志为空,说明请求未抵达PHP层。
1、查看Nginx错误日志:tail -f /var/log/nginx/error.log。
2、触发一次超限上传,观察是否出现"client intended to send too large body"字样。
3、若存在该提示,说明client_max_body_size仍未生效或未应用到正确server块。
4、若无此提示但上传仍失败,需转向检查PHP层配置或网络中间件。
五、禁用Nginx缓存干扰上传流程
Nginx默认可能对POST请求启用缓冲或缓存策略,尤其在启用了proxy_buffering或fastcgi_buffering时,大文件可能因缓冲区不足被截断或延迟转发。
1、在对应server或location块中添加:proxy_buffering off;(若使用proxy_pass)。
2、若直连PHP-FPM,添加:fastcgi_buffering off;。
3、同时增大缓冲区容量(可选):fastcgi_buffers 16 256k;与fastcgi_buffer_size 256k;。
4、再次执行nginx -t && nginx -s reload。



















