记一次下载大文件存在数据异常问题排查

栏目: 服务器 · Nginx · 发布时间: 5年前

内容简介:最近遇到了一个很诡异的问题,有用户反馈从文件下载服务测试环境下载一个视频文件,每次MD5都不一样。。。对于文件下载服务来说,下载文件内容错乱是个很严重的问题了,但是之前一直也没遇到过文件内容错乱的问题。看了一下问题文件,是一个视频文件,大小为1.08GB。第一个反应就是可能是一个大文件下载才会触发的问题。接着问用户如何发现这个问题的,答曰因为这个视频文件播放到最后很卡,第二个反应是下载到最后存在数据错乱。自己测试了一下,测试环境是100%复现,每次的MD5都是不一样的。改用另外的大于1G的文件,一样能复现,

最近遇到了一个很诡异的问题,有用户反馈从文件下载服务测试环境下载一个视频文件,每次MD5都不一样。。。

对于文件下载服务来说,下载文件内容错乱是个很严重的问题了,但是之前一直也没遇到过文件内容错乱的问题。看了一下问题文件,是一个视频文件,大小为1.08GB。第一个反应就是可能是一个大文件下载才会触发的问题。接着问用户如何发现这个问题的,答曰因为这个视频文件播放到最后很卡,第二个反应是下载到最后存在数据错乱。

自己测试了一下,测试环境是100%复现,每次的MD5都是不一样的。改用另外的大于1G的文件,一样能复现,排除了特定文件的可能。接着测试500MB的文件和900MB,发现没问题,推测问题是出在大于1GB的文件上。但是,生产环境却没有这个问题。。。

本地起Tomcat测试,竟然发现没有复现,结合该应用稳定运行多年,线上也没有人反馈文件异常问题,推测应用本身的逻辑应该是正常的。怀疑的焦点转移到了Nginx上。直接访问测试环境的Tomcat,发现也是正常的,确定是Nginx问题。

查看Nginx日志,发现有很重要的信息:

2019/06/28 11:28:27 [error] 15032#15032: *5973942305 upstream prematurely closed connection while reading upstream, client: 192.168.237.155, server: debug.web.com, request: "GET /v0.1/static/test_mzb/bigtest-d072bc5950f767009175668f781faaf2.rar HTTP/1.1", upstream: "http://172.xx.xx.xx:8092/v0.1/static/test_mzb/bigtest-d072bc5950f767009175668f781faaf2.rar", host: "debug.web.com"

upstream prematurely closed connection while reading upstream 这个错误信息的意思是Nginx读取Tomcat请求时,后端服务关闭了连接。网上找到了对应错误的讨论: Upstream prematurely closed connection while reading upstream · Issue #5706 · owncloud/client ,这篇issue中,有人说通过设置 proxy_request_buffering off;proxy_buffering off; 可以解决这个问题。通过这个线索,怀疑是Nginx的缓存功能导致的问题。

查看Nginx文档, Module ngx_http_proxy_module ,其中描述了在作为代理服务器时,是否缓存响应的相关配置。总的开关配置是 proxy_buffering ,表示是否开启反向代理服务对Response的缓存,默认开启。开始缓存时,Nginx会以最快的速度从后端服务读取Response内容,缓存到缓冲区中,缓冲区的大小由 proxy_buffer_sizeproxy_buffers 配置项指定。如果缓冲区无法装下所有的响应,则响应的内容会写入到缓存文件中,缓存文件的最大大小由 proxy_max_temp_file_size 配置项指定,默认为1G。Nginx这个缓存行为会进行到Response读取完毕,或者是缓存文件写满。

这个缓存文件大小为1G,与出问题的文件是大于1G相吻合。所以可以推论问题的原因是因为用户下载文件,Nginx会以最快速度从Tomcat获取文件流,因为Nginx与Tomcat处于一个内网,带宽很高,很快就会把1G的缓存文件写满,然后用户慢慢下载,当用户下载完这缓存的内容后,Nginx继续从Tomcat获取剩余的内容,但是这会儿连接因为长时间没有读写过期关闭了,导致Nginx提示 upstream prematurely closed connection while reading upstream 错误。至于为什么用户会继续下载到后续的错误字节数据,这个要看Nginx的具体代码才能清楚了。

通过将 proxy_max_temp_file_size 配置为2G,发现问题解决了,可以确定是这个问题。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

重启

重启

米奇•乔尔 / 曲强 / 中信出版社 / 2014-6-10 / 45.00元

罗振宇、丹尼尔•平克、赛斯•高汀、丹•艾瑞里、谢家华、阿里安娜•赫芬顿强烈推荐! 美国亚马逊2013年年度商业&投资类图书榜前20名! 互联网时代五大剧变让企业和个人无处可逃 进化,或被扔在旧时代? 全球顶尖的数字预言家独特分享 商业转型与思维转型的实践指南 当个人变为互联世界中的一个节点,如何开启新的工作方式? 如何与顾客建立直接关系?如何进行实用主义营......一起来看看 《重启》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具