请求体过大(413 Request Entity Too Large)怎么解决

413 表示请求体超过某层限制。先定位应用、代理或 CDN 的拒绝层,再按业务上限协调 JSON、multipart 与总请求体限制,避免无限放宽造成资源耗尽。

最佳实践
应用程序模块协作插画

一句话回答:413 表示请求体大小超过了服务器允许的上限。先通过各层日志定位拒绝来源,再按业务需要协调限制,不能只为消除报错无限放宽:Express 应用把 express.json({ limit: '50mb' }) 的 limit 调大;文件上传还要调 multer 的 fileSize;前面有 Nginx 反向代理时必须同步调大 client_max_body_size(默认仅 1MB,最容易被忽略);有 CDN/WAF 再检查它们的限制。

应用层:Express

const express = require('express');
const app = express();

// Express 4.16+ 提供内置 JSON/urlencoded 解析中间件,不解析 multipart 文件上传
app.use(express.json({ limit: '50mb' }));
app.use(express.urlencoded({ limit: '50mb', extended: true }));

文件上传(multer):

const multer = require('multer');
// 示意:磁盘目录须可写,文件须鉴权、校验类型并按保留策略清理
const upload = multer({
  dest: '/var/lib/app/uploads',
  limits: { fileSize: 50 * 1024 * 1024, files: 1, fields: 10, parts: 11 }
});

app.post('/upload', upload.single('file'), (req, res) => {
  res.json({ message: '上传成功' });
});

其他框架类似:Nginx 后面跑 PHP 调 PHP 的 upload_max_filesize 与 post_max_size;Spring Boot 调 spring.servlet.multipart.max-file-size。

代理层:Nginx(最常漏)

应用调大了,Nginx 默认 1MB 的限制照样拦截,而且 413 页面来自 Nginx 而非应用:

server {
    client_max_body_size 55m;    # 可放 http / server / location 块
}

示例文件上限为 50 MiB,代理总请求体上限留到 55 MiB,以容纳 multipart 边界与字段;最终值须符合业务和容量预算。Multer 的 LIMIT_FILE_SIZE 需在错误处理中间件中按需映射到 413,否则并不保证自动返回 413。

改完 nginx -t && nginx -s reload。

随后分别提交低于和高于限制的测试请求,核对 Nginx 与应用日志中的状态码。跨实例排查时,可通过观测云 DataKit 日志采集汇集访问日志,提取路径和状态码后筛选 413,确认拒绝发生在哪个入口。

其他层的限制

层 配置项
CDN(Cloudflare 等) 上传上限依产品、套餐和配置而异,以当前文档为准
云 LB / API 网关 各网关产品/接口类型各有 payload 上限,不能用统一数值概括;超限可评估对象存储直传
Apache LimitRequestBody:Apache 2.4.54 起默认 1073741824 字节(1 GiB);2.4.53 及以前默认 0(不限)

大文件的正确姿势

调大 limit 只能救急。超过几十 MB 的上传应改用分片上传或对象存储直传:客户端先向应用要预签名 URL,再直传 OSS/S3,请求体根本不经过你的服务器,但对象存储自身仍有大小、签名、权限、分片及生命周期限制,不能保证消除所有上传失败。

常见问题(FAQ)

Q:明明改了 Express 的 limit,为什么还是 413?

A:顺序问题:请求先经过 Nginx/LB/CDN 才到 Express,任何一层限制都会拦截。看 413 响应的特征判断是谁拦的——Nginx 的 413 返回它自己的错误页,Express 的则带应用的错误格式。

Q:把 limit 设为无限大可以吗?

A:不要。请求体无上限等于敞开内存耗尽攻击(DoS)的大门。按业务实际上限设值,大文件走对象存储直传。

Q:413 和 504/超时有什么区别?

A:413 是"体积超限",可以依据 Content-Length 提前拒绝,也可能在读取过程中超限后才拒绝;504/超时是"传得太慢或处理太久"。大文件上传如果网络慢,可能先撞超时而不是 413——两者要分别调 limit 和 timeout。

核查依据

本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。


延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台