圖片顯示慢,檔案下載不完全,竟然是Nginx的鍋!
導讀 | 最近,一名讀者跟我說他透過瀏覽器訪問自己的伺服器時,圖片顯示的非常慢,以至於在瀏覽器中都無法完全載入出來,下載檔案時,更是惱火,檔案根本就無法完全下載下來。 |
作者個人研發的在高併發場景下,提供的簡單、穩定、可擴充套件的延遲訊息佇列框架,具有精準的定時任務和延遲佇列處理功能。自開源半年多以來,已成功為十幾家中小型企業提供了精準定時排程方案,經受住了生產環境的考驗。為使更多童鞋受益,現給出開源框架地址:
最近,一名讀者跟我說他透過瀏覽器訪問自己的伺服器時,圖片顯示的非常慢,以至於在瀏覽器中都無法完全載入出來,下載檔案時,更是惱火,檔案根本就無法完全下載下來。而且奇怪的是這位讀者所在的網路是沒啥問題的。於是,我便開始幫他排查各種問題。。。
經過一系列的排查(中間過程我就省略了,直接寫重點了!),最終定位到是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 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競然沒許可權,怪不得會出現上面的問題。
定位到問題,接下來解決問題就比較簡單了。可以使用兩種方式解決這個問題,如下所示。
1.設定任何人都可以寫 proxy_temp目錄,重啟 Nginx 即可解決。
2.直接更改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 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; }
當然,我也幫這位讀者最佳化了一些其他的配置項。
好了,今天就聊到這兒吧!別忘了點個贊,給個在看和轉發,讓更多的人看到,一起學習,一起進步!!
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2708671/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Nginx】圖片顯示過慢,檔案下載不完全,竟然是Nginx的鍋!!Nginx
- 預載入顯示圖片的藝術
- Spring Websocket實現文字、圖片、聲音、檔案下載及推送、接收及顯示(叢集模式)SpringWeb模式
- OSS實現檔案下載進度條顯示
- 上傳封面圖片前臺不顯示 Picture檔案裡可以看到上傳的圖片
- oracle 載入圖片檔案Oracle
- img圖片無法顯示利用onerror事件顯示替代圖片Error事件
- Asp.net C# 檔案下載,附件下載程式碼案例,不顯示檔案路徑ASP.NETC#
- Win10桌面圖示顯示緩慢怎麼辦_win10桌面圖示載入慢如何修復Win10
- 載入網路圖片所顯示的轉圈效果及載入成功前與失敗後所顯示的圖示
- ReactNative IOS下Image標籤載入網路圖片不顯示ReactiOS
- 【JavaScript】拖拽圖片檔案顯示縮圖 + div點選模擬 input[type=file]JavaScript
- jboss部署後第一次jsp檔案顯示非常的慢,要比tomcat下慢許多倍JSTomcat
- WinPE中如何改變檔案顯示圖示
- CSS圖片的灰色顯示效果CSS
- ImageView顯示網路上的圖片View
- QQ 群檔案下載後過期時間顯示 undefinedUndefined
- 【CLI】使用 Curl 下載檔案實時進度條顯示
- Nginx圖片下載不完整的處理過程Nginx
- Delphi下載指定網址(URL)的檔案,帶進度條顯示
- 解決下載的CHM檔案無法顯示網頁問題網頁
- 網頁圖片不能顯示 網頁圖片顯示不出來的解決辦法網頁
- qt 使用qmake pro檔案新增 ico圖示,程式執行時顯示圖示,exe也顯示圖示QT
- Java——圖片滾動顯示Java
- 關於vue打包後scss檔案中背景圖片不顯示問題VueCSS
- .net頁面載入顯示word檔案
- 純JS生成並下載各種文字檔案或圖片JS
- VC從檔案中載入圖片
- IOS下圖片不能顯示問題的解決辦法iOS
- 呼叫系統檔案管理器選擇圖片,呼叫系統裁剪AIP對圖片處理,顯示裁剪之後的圖片...AI
- scrapy 採集常用的Pipeline(輸出檔案、圖片下載)
- AXIOS從伺服器載入圖片並顯示iOS伺服器
- 第四章 載入並顯示PNG圖片
- opencv圖片上如何顯示兩個小圖片OpenCV
- win7圖片只顯示圖示不顯示預覽圖解決方案Win7圖解
- mac顯示隱藏檔案,取消顯示隱藏檔案Mac
- [BUG反饋]LINUX下圖示、圖片及驗證碼顯示不正確Linux
- Mac OSX 下如何顯示隱藏檔案Mac