当前位置:首页 >  IDC >  服务器 >  正文

Nginx 413 Request Entity Too Large:三处上传限制一起改才算改完

 2026-09-06 10:56  来源: 互联网   我来投稿 撤稿纠错

  一键部署OpenClaw

用户后台传一张 3MB 的图,页面转半天最后白屏,什么提示都没有。你去看浏览器请求,状态码 413 Request Entity Too Large。这个错误有个讨厌的特性:官方文档里明确写了浏览器没法正确渲染它,所以用户端看到往往不是 413 页面,而是一片白或者连接被重置,报障的时候只会说“传不上去”。

根因就一句话:Nginx 的 client_max_body_size 默认 1MB,请求体超过就直接拒,连后端的面都见不到。但很多人改完 Nginx 还是传不上去,是因为上传链路上一共卡着三道限制,只改一道等于没改。

# 第一道:Nginx(http/server/location 都可以设,location 优先级最高)
http {
client_max_body_size 100m;
client_body_buffer_size 128k; # 超过缓冲区的请求体会落盘临时文件
client_body_timeout 300s; # 大文件上传时默认 60s 可能不够
}

# 第二道:PHP 自身的上传限制(php.ini 或 FPM 的 conf.d 片段)
upload_max_filesize = 100M
post_max_size = 100M # 必须大于等于 upload_max_filesize
memory_limit = 256M # 官方建议 memory_limit 要比 post_max_size 大

# 第三道:FPM/Nginx 的超时,大文件传一半被掐断报的又是另一个错
# nginx: fastcgi_read_timeout 300; fastcgi: request_terminate_timeout = 300s

改完先做配置检查再重载,然后验证实际生效的值——用 nginx -T 把全量配置导出来 grep,比逐个文件翻靠谱,因为 client_max_body_size 可能同时写在 http 块、站点配置和某个 include 里,冲突时取的是最内层作用域的值。

nginx -t && systemctl reload nginx

# 确认当前生效的所有限制值
nginx -T 2>/dev/null | grep -n client_max_body_size

# PHP 侧确认(注意 FPM 和 CLI 是两套 php.ini,别改错对象)
php -i | grep -E "upload_max_filesize|post_max_size" # CLI
# FPM 侧建一个含

# 用 curl 直接验证 413 是否消失:造一个 5MB 的测试文件上传
dd if=/dev/zero of=/tmp/test5m.bin bs=1M count=5
curl -sS -o /dev/null -w "status:%{http_code}
"
\
-F "file=@/tmp/test5m.bin" https://你的域名/upload

curl 返回 200 就算通了。如果还是 413,去看 Nginx 的 error.log,里面会有一句非常明确的特征日志:client intended to send too large body,后面跟着具体字节数,对一下这个数就知道是哪一层在拦。另外提醒一句,如果前面还套了 CDN 或者第二层反代,每一层 Nginx 都要放行,只改源站这一层,边缘节点照样把你拦下来。

最后说下 size 0 这个选项:client_max_body_size 0 表示完全不限制请求体,能省事但等于把资源耗尽型攻击的门拆了,生产环境不建议。按业务给每个 location 设不同上限——上传接口 500m、普通 API 5m,才是正确用法。

收尾多说一句这个错误的观感问题:因为浏览器渲染不了 413 页面,用户报障永远只会说“上传失败”或者“网站坏了”,你从报障描述里根本看不出是大小问题。所以凡是有上传功能的站点,建议把 413 做成自定义错误页并在前端提前校验文件大小,用 JS 在提交前拦一道给出明确提示,服务端的这道闸留着兜底就行——体验和防护两头都占。

相关阅读:413 属于接入层的限制类故障。《服务器故障排查总纲:按现象反查的五层定位法》按现象把 502、403、413 这些报错各归其位,出事先翻总纲定层,再进单篇动手。

申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!

相关文章

  • PHP Allowed memory size exhausted:真泄漏还是配额太小

    日志里刷Fatalerror:Allowedmemorysizeof134217728bytesexhausted,后台某个导出功能一跑就挂。134217728字节就是128M,这是php.ini里memory_limit的官方默认值。很多人第一反应是把数字改大,先别急——内存溢出有两种完全不同的病

    标签:
    网站服务器
  • 重定向循环与 HTTPS 识别错乱:X-Forwarded-Proto 那些坑

    HTTPS证书配好、Nginx强制跳转也配好了,浏览器打开却提示ERR_TOO_MANY_REDIRECTS,重定向次数超限。这个故障的高发场景非常固定:网站前面挂了CDN、负载均衡或者第二层反向代理。浏览器到CDN是HTTPS,但CDN回源到你的Nginx走的是HTTP,于是循环就来了。拆开看这个

    标签:
    网站服务器
  • Nginx 403 Forbidden:权限、SELinux 与 deny 规则三层排查法

    新站刚部署,首页打开403Forbidden。403和404不一样,404是“没找到”,403是“找到了但不给你看”,所以问题一定出在服务端某一层权限上。Nginx报403的原因集中在三层:文件系统权限、SELinux、Nginx自身的访问控制规则,按这个顺序查,基本不会漏。先说最常见的文件系统权限

    标签:
    网站服务器
  • SSL 证书过期与证书链不完整:openssl s_client 验证与续期监控

    证书过期这事,一旦发生就是全站级别的红色警告。浏览器直接拦截,访客看到的不是你的网站,是一屏吓人的安全提示。更气人的是它完全可以避免——免费证书加自动续期,配好了就再也不用管。Let'sEncrypt的证书有效期是90天,这个短期限是刻意设计的,目的是逼着大家把续期自动化。Certbot是它官方推荐

  • 进程被 OOM Kill:dmesg 定位与关键进程保护

    有一种故障特别难查:服务莫名其妙消失了,应用日志里什么都没留下,没有崩溃堆栈,没有异常退出记录。进程就这么凭空不见。碰到这种情况,十有八九是内核干的——内存不够了,OOMKiller挑中它杀了。OOM的全称是OutofMemory,它是内核的最后手段。Linux默认采用乐观的内存分配策略,进程申请内

热门排行

信息推荐