413 Request Entity Too Large是一个让不少刚接触Nginx运维的人感到困惑的错误。明明PHP的upload_max_filesize已经调大了,代码层面也没有做任何体积限制,可只要上传的文件稍微大一点,页面就返回413,后台连请求都收不到。其实这个错误的拦截点不在PHP,也不在你的应用代码,而是在Nginx这一层。Nginx默认将客户端请求体的最大体积限制为1M,超过这个限制的请求会在Nginx内部直接被丢弃并返回413,根本不会转发给后端。

一、413错误的触发原理与排查方法
Nginx在处理客户端请求时,会先根据当前生效的client_max_body_size指令检查请求头中Content-Length声明的体积。如果请求体超过限制,Nginx不会读取完整请求体,而是立即返回413状态码。这个指令在Nginx官方默认配置中并不显式出现,其默认值是1M,这就是为什么一个只有几兆的文件就能触发报错的原因。
排查时可以先确认请求是否真的到达了后端。在CentOS上查看Nginx的访问日志,通常位于/var/log/nginx/access.log,如果日志中记录了状态码413,同时应用日志里完全没有这次请求的痕迹,就可以确定是Nginx层拦截的。还可以用curl直接测试:
curl -v -X POST -d @testfile http://127.0.0.1/upload # 如果返回 HTTP/1.1 413 Request Entity Too Large,说明确实是Nginx拦截
另外要注意,如果你使用的是反向代理架构(Nginx在前、后端服务在后),413一定是由最外层的Nginx返回的,内网后端服务往往还有自己独立的请求体限制,需要分别检查。
二、修改client_max_body_size彻底解决报错
解决方法很直接:在Nginx配置中显式声明允许的请求体上限。打开主配置文件/etc/nginx/nginx.conf,在http、server或location三个层级中任意一层添加client_max_body_size指令:
http {
client_max_body_size 50m; # 对所有站点生效
server {
listen 80;
server_name example.ipipp.com;
# client_max_body_size 50m; 也可以只对当前server生效
location /upload {
# client_max_body_size 100m; 粒度最细,只对该路径生效
proxy_pass http://127.0.0.1:8080;
}
}
}三个层级的优先级遵循就近原则:location中的配置会覆盖server,server会覆盖http。建议根据实际业务设置,不要盲目调到几个G,上限越大意味着单个连接占用的内存和带宽风险越高,也更容易被恶意大包攻击。
修改完成后必须让Nginx重新加载配置,在CentOS上执行:
nginx -t # 先检查语法,显示ok和successful才继续 systemctl reload nginx # 平滑重载,不会中断现有连接
如果nginx -t报错,通常是漏了分号或者花括号不匹配,先修正再reload。很多人改完配置忘记reload,或者只执行了nginx -t没重载,就会误以为配置无效。
三、容易被忽略的配套限制:PHP与反向代理
Nginx这一关过了之后,如果后端是PHP(例如通过php-fpm处理),还需要同步调整php.ini中的两个参数,否则会出现413消失了但上传仍然失败的情况。CentOS下php.ini一般位于/etc/php.ini,找到并修改:
upload_max_filesize = 50M post_max_size = 50M ; post_max_size 建议略大于 upload_max_filesize,因为POST数据还包含表单字段 memory_limit = 256M ; 上传大文件时内存限制也应适当放宽 max_execution_time = 300 ; 慢网络下大文件上传可能超时 max_input_time = 300
修改后重启php-fpm服务:systemctl restart php-fpm。注意post_max_size必须大于等于upload_max_filesize,否则表单里附带的其他字段会超出POST总大小限制,PHP层面又会抛出新的错误。
还有一个隐蔽的坑是client_body_timeout。Nginx读取请求体的默认超时是60秒,当客户端上传一个大文件但网速较慢时,即使体积没超限,也可能因为读取超时而失败。可以在同一层级加上:
client_body_timeout 300s; # 读取请求体的超时时间,按需调整 proxy_read_timeout 300s; # 反向代理场景下后端处理耗时也会受此约束
总结一下完整的排查链路:先看Nginx访问日志确认413来源,再用client_max_body_size放开Nginx限制,接着检查PHP的upload_max_filesize和post_max_size,最后留意各类超时参数。逐层核对下来,大文件上传的问题就能彻底解决。
Nginx 413错误client_max_body_sizeCentOS Nginx配置修改时间:2026-09-03 04:40:34