背景
开发了一个内容管理发布系统,在后台发布内容信息时,上传了一个较大的视频(较大文件≥200M),以往未上传过如此大文件,然后出现报错 Status Code 413
问题&处理过程
1. status code:413 Request Entiry Too large
上传文件失败,请求实体太大
分析可能原因:
① servlet 文件上传配置,限制了文件大小
② 网关/代理转发限制了包的大小
排查(利用测试环境和本地环境):
① 上传较小文件——成功
② 上传较大文件——成功<200M
③ 上传大文件——成功>200M——413
④ 查看配置文件——发现设置了上传文件大小限制为最大200M
⑤ 更改为500M——本地接口测试——上传较大文件——成功
注意:还没有结束!!!后面还有坑!!!
此时已经定位到了我们第一个分析的可能原因:配置上限制了文件大小
当我认为已经解决了之后,当然没有直接发正式版本,发了个测试环境,而且我本地接口已经通过测试,在测试环境直接上传大文件(这里我的文件是350M),啪啪啪,又报错了!!!
继续排查(测试环境直接报错,代码已上传)
⑥ 紧接上回,通过测试环境前端页面,上传大文件(200~500M)——超时中断
⑦ 重复⑥上传多次,全部响应超时,但有一个规律——都是在30s处中断(重点)
⑧ 在准备分析此项原因之前,我还需要排查一下接口,所以我又用接口的形式在测试环境上传了大文件,结果——成功了(回顾改了顺序,之前走了弯路)
继续分析
③ 设置了接口最大响应时间或最大连接时间30s,或默认为30s(这里已经排除了)
④ 网关/代理设置了最大发送时间或最大连接时间30s,或默认30s
再次开始排查
⑧ 再接上回,直接验证分析④,测试环境是没有做代理的,就很奇怪,还是设置了分析③的配置
当然是没有用的,哈哈哈哈
⑨ 剑走偏锋,偷偷地在正式环境更改配置(当然是跟基础支撑的技术组沟通好了),因为我们用的K8s的部署环境(KubeShpere),配置文件也在上面,更改后直接重新创建副本就可以了,开干,这里主要在路由配置里加上网关代理的配置
大小,超时都配上了,果不其然,还是不行,当然包的大小已经可以了——30s超时中断
⑩ 山穷水尽疑无路,柳暗花明又一村。不是你不够聪明勤快,而是你走错了路!!!
分析!!!
⑤ 我们之前一直考虑的都是后端服务端的问题,这时候就有同学提出了,是不是客户端主动中断的,而且这个30s实在是太明确了
排查:我还是前端接触得太少,直接冲向了负责前端的同事,温柔地向他提出了疑问,我这个文件上传怎么一直在30s处就中断,你们是不是写死了30s!!!!!!!!!
果不其然,就是他们前端写死的30s,让他们把那个地方配置为60s,就解决了,至此此问题解决。