Nginx 413 排错client_max_body_size 加在哪一层才生效现象上传一个 20 多 MB 的附件前端直接弹 413413 Request Entity Too Large nginx/1.20.2不是超时也不是网络中断请求压根没进后端。环境链路浏览器 → Nginx(443) → 反向代理 → Spring Boot(8080)站点配置在/etc/nginx/conf.d/app.conf后端spring.servlet.multipart.max-request-size早就调到 100MB 了后端限制已经放开所以问题不在 Java 这边。先确认是 Nginx 拦的这一步别跳。判断方法很简单去看后端访问日志。413 是 Nginx 读完请求头、发现Content-Length超限就直接返回的请求不会转发给 upstream。所以如果这次上传在 Spring Boot 的 access log 里完全没有记录而错误页又是标准的 Nginx 样式、响应头带Server: nginx那就基本确定拦在 Nginx 层了。Nginx 自己的 error.log 里会留一句client intended to send too large body: 25165824 bytes看到这句就不用再怀疑了。另外如果这个请求是 JSON 而不是文件client_max_body_size一样管它不是只针对 multipart 上传的。加在哪client_max_body_size只能写在三个地方http、server、location。作用域越小优先级越高也就是location server http。想让整个站点生效写在server 块的大括号里面和listen、server_name同级别写进locationserver { listen 443 ssl; server_name example.com; client_max_body_size 100m; root /www/wwwroot/example; index index.html; location / { try_files $uri $uri/ /index.php?$query_string; } }写在 server 块里的哪一行其实无所谓Nginx 不靠顺序解析这个指令。我习惯塞在server_name下面改的时候一眼能找到。几个容易写错的位置写进http {}外面或者events {}里 ——nginx -t直接报错指令不允许出现在那儿写进某个location里 —— 只对匹配这个 location 的请求生效其他路径还是默认的 1m同一个 server 块里写了两次 —— 报client_max_body_size directive is duplicate改之前先 grep 一下有没有旧值只想放开上传接口那就别在 server 层放大收窄到具体路径更安全server { listen 443 ssl; server_name example.com; location /api/upload { client_max_body_size 100m; proxy_pass http://127.0.0.1:8080; } }全站放开 100m 意味着任何一个接口都能被打 100MB 的包能收窄就收窄。所有站点统一放开写在nginx.conf的http块里http { client_max_body_size 100m; include /etc/nginx/conf.d/*.conf; }之后某个站点想单独收紧在它的 server 块里再写一次小的值就行。改完别忘了这一步nginx-tnginx-sreloadnginx -t一定要跑配置写错位置它会直接告诉你哪一行。还是 413reload 之后仍然 413按这个顺序查改的不是那台 Nginx。链路里可能还有一层CDN、WAF、SLB或者前面还架着一台反代。看错误页样式和Server响应头是谁返回的就改谁。这是最常见的原因。80 和 443 两个 server 块。只改了监听 80 的那个实际流量走的是 443 的块等于没改。后端自己的限制。Nginx 放行之后请求才轮到应用PHP 的post_max_size、upload_max_filesizeTomcat 的maxPostSizeExpress 的express.json({ limit })各自还得对上。面板改错地方。用宝塔的话在「网站 → 设置 → 配置文件」里改改完在面板里重载别直接手改/www/server/nginx/conf/nginx.conf就以为生效了。有没有必要把限制调得很大不建议。真要传大文件比堆client_max_body_size靠谱的做法是前端先压缩或者分片上传 断点续传走对象存储预签名 URL 直传body 根本不过自己的 Nginx流式处理别把整个 body 一次性读进内存这个阀门存在的意义就是挡恶意大包图省事设成 0等于关掉检查迟早要在别的地方还回来。附各层对应的参数排查的时候对着找就行层级配置Nginxclient_max_body_size 100m;ApacheLimitRequestBody 104857600单位字节PHPupload_max_filesize 100M、post_max_size 100M后者要大于前者Spring Bootspring.servlet.multipart.max-file-size、max-request-sizeTomcatmaxPostSize、maxSwallowSizeNode/Expressexpress.json({ limit: 100mb })、multer 的limits.fileSize云网关/CDNAPI Gateway、Cloudflare、WAF、ALB 各有各的请求体上限