基于nginx网关的浏览器上传大文件失败问题分析

前言

​ nginx用的时候很开心,出现问题时却很要命。这次出现的问题虽然能有很多方式去解决,但我仍旧希望能够用一个问题将知识进行串联,深挖其根因。

问题现象

浏览器上传文件,文件大小是四百多M,等待一段时间后,上传失败。显示报错如下图:

基于nginx网关的浏览器上传大文件失败问题分析_第1张图片

问题排查

信息收集

遇到这种问题上面出现了两个错误,一个是网络错误,一个返回的是413。413这个错误信息提示很明显,Request Entity Too Large。凭多年老司机经验,查看nginx配置,发现配置的client_max_body_size为300m。将其配置改为client_max_body_size为2000m。再次上传文件,测试。还是报错,但是这次报错只有net::ERROR_CONNECTION_ABORTED。

再次凭借老司机的经验,怀疑文件过大,引起的超时,至于在哪里超时,我们要看看这个具体情况。我通过复现,再配合整个链路日志排查。我整体梳理出了的信息情况如下图。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h6xl82Hv-1626016425573)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a1433d347c734357a2c0585e242847dc~tplv-k3u1fbpfcp-watermark.image)]
可是实际现象明明是net::ERROR_CONNECTION_ABORTED,复现却返回的是504。这到底是怎么回事?

问题分析

从整个日志请求的返回来看,slb日志显示504,而nginx的日志显示返回码是499。基本上可以断定情况是nginx侧的响应时间过长,slb主动断开了连接。

504:Gateway Timeout 网关超时

499:Client Closed Request 客户端主动断开连接

由于SLB不是我们管理,需要向云厂商确认proxy_read_timeout的情况,经过确认,其配置为60s。这样与我们的nginx的499,请求时间是60s的现象符合。

你可能感兴趣的:(nginx,nginx)