首页 科技正文

【Nginx】图片显示过慢,文件下载不完全,竟然是Nginx的锅!!

admin 科技 2020-07-22 37 0

写在前面

最近,一名读者跟我说他通过浏览器接见自己的服务器时,图片显示的异常慢,以至于在浏览器中都无法完全加载出来,下载文件时,更是恼火,文件根本就无法完全下载下来。而且奇怪的是这位读者所在的网络是没啥问题的。于是,我便最先帮他排查种种问题。。。

问题定位

经由一系列的排查(中心历程我就省略了,直接写重点了!),最终定位到是Nginx的问题。当我打开这位读者的网站后台治理系统,发现图片显示异常慢,在Nginx前端署理上查出如下错误信息。

[error] 28423#0: *5 connect() failed (111: Connection refused) while connecting to upstream

直接在后台服务器上用后台服务器的IP地址去接见,发现速率相当快,于是怀疑是Nginx的设置问题。

注重:当下载大的附件,或是页面中有大图片时,就会下载中止或是图片无法显示,也许你会说我用的Nginx缺省的设置也从来没有碰到过这种问题呀!我想说的是:那是由于你的网站没有大文件,至少没有大到使用Nginx的默认设置加载不出来。

这里,我给出一段Nginx的设置,如下所示。

location /file {
	 root /home/file;
	 index  index.html index.htm;
	 proxy_set_header X-Real-IP $remote_addr;
	 proxy_set_header   Host $host;
	 proxy_pass http://127.0.0.1:8080 ;
	 client_max_body_size     100m;
	 client_body_buffer_size  128k;
	 proxy_connect_timeout    600;
	 proxy_read_timeout       600;
	 proxy_send_timeout       600;
	 proxy_buffer_size        32k;
	 proxy_buffers          4 64k;
	 proxy_busy_buffers_size 64k;
	 proxy_temp_file_write_size 64k;
}

其中几个主要的参数如下所示。

  • proxy_connect_timeout 600; #nginx跟后端服务器毗邻超时时间(署理毗邻超时)
  • proxy_read_timeout 600; #毗邻乐成后,后端服务器响应时间(署理吸收超时)
  • proxy_send_timeout 600; #后端服务器数据回传时间(署理发送超时)
  • proxy_buffer_size 32k; #设置署理服务器(nginx)保留用户头信息的缓冲区巨细
  • proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
  • proxy_busy_buffers_size 64k; #高负荷下缓冲巨细(proxy_buffers*2)
  • proxy_temp_file_write_size 16k; #设定缓存文件夹巨细,大于这个值,将从upstream服务器传

看到这里,发现问题了,这位读者的Nginx有下面一行设置。

proxy_temp_file_write_size 16k;

而他服务器上的图片基本都在100K~5M之间。

问题就出在proxy_temp_file_write_size上,当服务器上的文件跨越该参数设置的巨细时,Nginx会先将文件写入暂且目录(缺省为Nginx安装目下/proxy_temp目录),缺省Nginx是以nobody身份启动的,用ls -al 下令查看proxy_temp目录 nobody是proxy_temp目录的所有者,怪了那为什么没权限呢?接下来查看proxy_temp的父目录既Nginx安装目录。发现nobody竞然没权限,怪不得会泛起上面的问题。

解决问题

定位到问题,接下来解决问题就比较简单了。可以使用两种方式解决这个问题,如下所示。

  • 设置任何人都可以写 proxy_temp目录,重启 Nginx 即可解决。
  • 直接更改proxy_temp_file_write_size的值,将其修改为大于图片和文件的巨细,重启Nginx。

若是是以第一种方式解决问题的话,好比我的proxy_temp目录是/usr/local/nginx/proxy_temp,用如下下令将/usr/local/nginx/proxy_temp目录设置为任何人都可以写,问题解决。

chmod -R 777 /usr/local/nginx/proxy_temp/ 

若是是使用第二种方式解决问题的话,就可以直接修改nginx.conf文件,如下所示。

location /file {
	 root /home/file;
	 index  index.html index.htm;
	 proxy_set_header X-Real-IP $remote_addr;
	 proxy_set_header   Host $host;
	 proxy_pass http://127.0.0.1:8080 ;
	 client_max_body_size     100m;
	 client_body_buffer_size  256k;
	 proxy_connect_timeout    1200;
	 proxy_read_timeout       1200;
	 proxy_send_timeout       6000;
	 proxy_buffer_size        32k;
	 proxy_buffers            4 64k;
	 proxy_busy_buffers_size  128k;
	 proxy_temp_file_write_size 10m;
}

固然,我也帮这位读者优化了一些其他的设置项。

好了,今天就聊到这儿吧!别忘了点个赞,给个在看和转发,让更多的人看到,一起学习,一起提高!!

写在最后

若是你以为冰河写的还不错,请微信搜索并关注「 冰河手艺 」微信民众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生手艺,「 冰河手艺 」微信民众号更新了大量手艺专题,每一篇手艺文章干货满满!不少读者已经通过阅读「 冰河手艺 」微信民众号文章,吊打面试官,乐成跳槽到大厂;也有不少读者实现了手艺上的飞跃,成为公司的手艺骨干!若是你也想像他们一样提升自己的能力,实现手艺能力的飞跃,进大厂,升职加薪,那就关注「 冰河手艺 」微信民众号吧,天天更新超硬核手艺干货,让你对若何提升手艺能力不再渺茫!

,

环球UG

欢迎进入环球UG官网(UG环球):www.ugbet.us,环球UG官方网站:www.ugbet.net开放环球UG网址访问、环球UG会员注册、环球UG代理申请、环球UG电脑客户端、环球UG手机版下载等业务。

版权声明

本文仅代表作者观点,
不代表本站Sunbet的立场。
本文系作者授权发表,未经许可,不得转载。

评论