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

开发 架构 服务器
最近,一名读者跟我说他通过浏览器访问自己的服务器时,图片显示的非常慢,以至于在浏览器中都无法完全加载出来,下载文件时,更是恼火,文件根本就无法完全下载下来。

 作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:https://github.com/sunshinelyz/mykit-delay

[[334524]]

写在前面

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

问题定位

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

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

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

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

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

  1. location /file { 
  2.      root /home/file; 
  3.      index  index.html index.htm; 
  4.      proxy_set_header X-Real-IP $remote_addr; 
  5.      proxy_set_header   Host $host; 
  6.      proxy_pass http://127.0.0.1:8080 ; 
  7.      client_max_body_size     100m; 
  8.      client_body_buffer_size  128k; 
  9.      proxy_connect_timeout    600; 
  10.      proxy_read_timeout       600; 
  11.      proxy_send_timeout       600; 
  12.      proxy_buffer_size        32k; 
  13.      proxy_buffers          4 64k; 
  14.      proxy_busy_buffers_size 64k; 
  15.      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有下面一行配置。

  1. 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目录设置为任何人都可以写,问题解决。

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

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

  1. location /file { 
  2.      root /home/file; 
  3.      index  index.html index.htm; 
  4.      proxy_set_header X-Real-IP $remote_addr; 
  5.      proxy_set_header   Host $host; 
  6.      proxy_pass http://127.0.0.1:8080 ; 
  7.      client_max_body_size     100m; 
  8.      client_body_buffer_size  256k; 
  9.      proxy_connect_timeout    1200; 
  10.      proxy_read_timeout       1200; 
  11.      proxy_send_timeout       6000; 
  12.      proxy_buffer_size        32k; 
  13.      proxy_buffers            4 64k; 
  14.      proxy_busy_buffers_size  128k; 
  15.      proxy_temp_file_write_size 10m; 

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

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

本文转载自微信公众号「 冰河技术」,可以通过以下二维码关注。转载本文请联系 冰河技术公众号。

 

责任编辑:武晓燕 来源: 冰河技术
相关推荐

2020-12-29 05:39:44

日志服务环境

2015-09-01 10:42:15

编程规范完全指南

2015-10-10 10:02:44

程序员面试指南

2017-04-13 08:46:41

oracle数据挖掘

2014-09-19 10:03:18

Chrome

2021-06-01 06:03:28

Css前端CSS 特效

2024-01-02 16:43:58

2011-06-29 10:03:33

Qt Configure

2024-01-12 10:16:53

2021-05-06 07:26:55

CSS 文字动画技巧

2020-09-29 06:45:49

JDK

2021-02-09 00:46:45

区块链加密货币工具

2015-06-18 11:04:58

2020-12-15 08:05:40

路由器服务器网络层

2021-07-28 06:51:08

Nacos代理模式

2024-08-05 01:28:26

2021-08-18 10:28:09

MySQL SQL 语句数据库

2019-04-12 15:00:11

2017-04-19 20:10:20

SQLJOIN

2024-09-27 11:38:49

点赞
收藏

51CTO技术栈公众号