Nginx代理转发时图片只加载一半的问题排查

今天在测试公司活动项目的过程中,出现了一个特别奇怪的问题:
一张图片在直接访问原始url地址时,可以很快的被加载出来,但是访问被nginx做了转发的地址之后,就只能显示一部分图片,而且要等好久才能请求结束,并且图片依然无法正常展示出来!效果如下图所示。
 

QQ图片20180419215326.png

一张二维码被展示成了这个效果
 
最后研究了半天,终于查到了出现问题的原因。
 
要说明这个问题,首先要知道和了解一个Nginx上的概念:buffer工作原理,详细可以阅读:https://ask.zkbhj.com/?/article/227 。
 
其中很重要的一段话:


在proxy_buffering 开启的情况下,Nginx将会尽可能的读取所有的upstream端传输的数据到buffer,直到proxy_buffers设置的所有buffer们被写满或者数据被读取完(EOF)。此时nginx开始向客户端传输数据,会同时传输这一整串buffer们。同时如果response的内容很大的话,Nginx会接收并把他们写入到temp_file里去。大小由proxy_max_temp_file_size控制。如果busy的buffer传输完了会从temp_file里面接着读数据,直到传输完毕。


嗯,图片文件一般都会比较大,proxy_buffers肯定一次性容纳不下,需要写入到temp_file中去。这个时候,去看nginx的错误日志,发现了如下几行错误信息:

QQ截图20180419220630.jpg


哈哈,Permission denied!就是这个原因了,在写入这个目录时,权限不足,造成浏览器一直在等待。
 
找到了问题的根源,解决也就轻松了。有两种解决方法,一种是:关闭掉proxy_buffer,在nginx配置文件中加入:
proxy_buffering off;

另外一种,就是把目录权限更改为可写。
 
到此问题解决。记录一下以便遇到同样问题的同学可以查看如何解决这个“问题”!

0 个评论

要回复文章请先登录注册