今天在下载大文件(文件大小1.2GB)的时候,发现文件下载到99.98%的时候卡住了,控制台报了个
net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK)
,因此做个记录。
nginx配置文档
1. 如何排查问题
① 先通过其他工具比如postman测试接口是否能完全下载成功,如果能下载成功,排除后端问题;
② 不经过nginx代理,看文件是否能下载成功,如果成功,排除代码问题;
③ 以上2步如果都没问题,大概率就是nginx的问题了。
2. nginx解决
2.1 查看nginx报错日志
去nginx.conf
中查看nginx日志路径,一般是/var/log/nginx/error.log
;
由图2-1可知,niginx报
upstream prematurely colose connection while reading upstream
,百度说是后端传输的数据量太多了,超过了nginx设置的缓存区大小;
2.2 解决办法
① 解决办法一:简单粗暴的关闭nginx缓冲
在nginx.conf
的http
模块内加入
# 取消nginx缓冲
proxy_request_buffering off;
proxy_buffering off;
② 解决办法二:设置临时缓冲大小
# 开启缓冲
proxy_buffering on;
# 从代理服务器接收到的响应的第一部分的缓冲区
proxy_buffer_size 4k|8k;
# 代理缓冲区 8 4k|8k;
proxy_buffers 8 4k|8k;
# 向客户端发送响应的缓冲区
proxy_busy_buffers_size 8k|16k;
由于以上四个参数是nginx的默认配置,因此解决办法二只需设置临时缓冲大小即可(也就是说proxy_max_temp_file_size
和上面四个参数配套出现时才会生效)。
在nginx.conf
的http
模块内加入
# 临时缓冲区不限制大小
proxy_max_temp_file_size 0;
2.3 原理
proxy_buffer_size 64k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
在proxy_buffering
开启的情况下,Nginx将会尽可能的读取所有的upstream端传输的数据到proxy_buffer_size
中去(存储大小为64k),直到proxy_buffers
设置的所有buffer们 被写满或者数据被读取完(存储大小为4*32k),这里可以理解为后端返回的数据最大64k+6*64k
,此时就开始向客户端传输数据。
如果后端返回的数据量真的很大的话,nginx接受设置临时缓冲区 proxy_max_temp_file_size 5000m;
proxy_busy_buffers_size
表示 64k传输完成后,会从temp_file
里面接着读数据,直到传输完毕。
网友评论