目录
1. 背景
前端有个数据转换的功能,需要将接口的response参数进行解密,由于response数据太大,导致POST方法报413。
request header中显示实体大小为1225231字节,约1.2M数据
Content-Length:指定消息主体的字节长度,用于告知接收方需要读取多少字节的数据
2. 分析
2.1 413码的含义
上网查一下,发现413码的描述各不相同,有"413 Request Entity Too Large",有"413 Payload Too Large",用AI查了一下,区别如下:
表述方式 | 典型触发场景 |
---|---|
413 Request Entity Too Large | 旧版服务器(如Nginx/Apache)的默认错误提示,常见于文件上传、POST请求过大。 |
413 Content Too Large | 某些框架(如Spring)或CDN的自定义错误消息,语义与 Payload Too Large 相同。 |
413 Payload Too Large | 现代HTTP标准术语,涵盖所有请求体过大的情况(如JSON、文件、表单数据)。 |
那文件上传云存储服务的数据量更大,为啥没有报错呢?去查看文件上传的代码,上传到公司内云服务,单文件限制5GB,太大的文件可以采用分块上传
2.1 请求体限制来源
(1) 服务器配置
服务器/框架 | 默认限制 | 配置方法示例 |
---|---|---|
Nginx | 1MB | client_max_body_size 100M; |
Apache | 2GB (编译时默认) | LimitRequestBody 104857600 (100MB) |
Tomcat | 2MB (表单提交) | maxPostSize="20971520" (20MB) |
Spring Boot | 1MB (文件上传) | spring.servlet.multipart.max-file-size=10MB |
(2) 客户端限制
- 浏览器:无硬性限制,但大文件可能导致内存溢出或超时。
- 编程语言 HTTP 库:
- Python
requests
:无内置限制,但受内存限制。 - Node.js
http
:默认约 16KB 缓冲区,需手动处理流式上传。
- Python
(3) 网络环境
- 代理/网关:如 Cloudflare 默认限制 100MB。
- CDN:可能限制单次请求体大小(如 AWS CloudFront 默认 20GB)。
由以上分析,1.2M被限制很可能是Nginx与Spring Boot限制。
3. 解决方式
- 客户端调整:
- 减少请求体大小(如压缩数据、分片上传)。
- 检查
Content-Length
或Transfer-Encoding
头部是否合法。
- 服务器调整:
- Nginx: 修改
client_max_body_size
:
http { client_max_body_size 20M; # 允许最大20MB的请求体 }
- Apache: 设置
LimitRequestBody
:
LimitRequestBody 10485760 # 允许最大10MB
- Spring Boot: 配置
spring.servlet.multipart.max-request-size
。
- Nginx: 修改
4. 实际解决
发现Spring Boot已经设置了很大了,所以排除是Spring Boot服务端限制,现在只剩下Nginx限制了,线上环境Nginx中没有配置client_max_body_size,默认是1M
test环境和预发环境的Nginx有配置client_max_body_size,如下:
在test环境和预发环境进行数据转换,确实没有报413,至此原因已经找出,需要将线上的Nginx配置中增加client_max_body_size,根据日常的数据量大小,可以配置为5M。
修改->审批->测试,没问题
其它方案:本来是想在前端对请求实体进行压缩,然后在服务端解压处理。