圖片顯示過慢,文件下載不完全,竟然是Nginx的鍋.
- 標(biāo)簽 :
寫在前面
最近,一名讀者跟我說他通過瀏覽器訪問自己的服務(wù)器時(shí),圖片顯示的非常慢,以至于在瀏覽器中都無法完全加載出來,下載文件時(shí),更是惱火,文件根本就無法完全下載下來。而且奇怪的是這位讀者所在的網(wǎng)絡(luò)是沒啥問題的。于是,我便開始幫他排查各種問題。。。
問題定位
經(jīng)過一系列的排查(中間過程我就省略了,直接寫重點(diǎn)了?。?,最終定位到是Nginx的問題。當(dāng)我打開這位讀者的網(wǎng)站后臺(tái)管理系統(tǒng),發(fā)現(xiàn)圖片顯示非常慢,在Nginx前端代理上查出如下錯(cuò)誤信息。
[error]?28423#0:?*5?connect()?failed?(111:?Connection?refused)?while?connecting?to?upstream
直接在后臺(tái)服務(wù)器上用后臺(tái)服務(wù)器的IP地址去訪問,發(fā)現(xiàn)速度相當(dāng)快,于是懷疑是Nginx的配置問題。
注意:當(dāng)下載大的附件,或是頁(yè)面中有大圖片時(shí),就會(huì)下載中斷或是圖片無法顯示,也許你會(huì)說我用的Nginx缺省的配置也從來沒有碰到過這種問題呀!我想說的是:那是因?yàn)槟愕木W(wǎng)站沒有大文件,至少?zèng)]有大到使用Nginx的默認(rèn)配置加載不出來。
這里,我給出一段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;
}
其中幾個(gè)重要的參數(shù)如下所示。
- proxy_connect_timeout 600; #nginx跟后端服務(wù)器連接超時(shí)時(shí)間(代理連接超時(shí))
- proxy_read_timeout 600; #連接成功后,后端服務(wù)器響應(yīng)時(shí)間(代理接收超時(shí))
- proxy_send_timeout 600; #后端服務(wù)器數(shù)據(jù)回傳時(shí)間(代理發(fā)送超時(shí))
- proxy_buffer_size 32k; #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小
- proxy_buffers 4 32k; #proxy_buffers緩沖區(qū),網(wǎng)頁(yè)平均在32k以下的話,這樣設(shè)置
- proxy_busy_buffers_size 64k; #高負(fù)荷下緩沖大?。╬roxy_buffers*2)
- proxy_temp_file_write_size 16k; #設(shè)定緩存文件夾大小,大于這個(gè)值,將從upstream服務(wù)器傳
看到這里,發(fā)現(xiàn)問題了,這位讀者的Nginx有下面一行配置。
proxy_temp_file_write_size?16k;
而他服務(wù)器上的圖片基本都在100K~5M之間。
問題就出在proxy_temp_file_write_size上,當(dāng)服務(wù)器上的文件超過該參數(shù)設(shè)置的大小時(shí),Nginx會(huì)先將文件寫入臨時(shí)目錄(缺省為Nginx安裝目下/proxy_temp目錄),缺省Nginx是以nobody身份啟動(dòng)的,用ls -al 命令查看proxy_temp目錄 nobody是proxy_temp目錄的所有者,怪了那為什么沒權(quán)限呢?接下來查看proxy_temp的父目錄既Nginx安裝目錄。發(fā)現(xiàn)nobody競(jìng)?cè)粵]權(quán)限,怪不得會(huì)出現(xiàn)上面的問題。
解決問題
定位到問題,接下來解決問題就比較簡(jiǎn)單了。可以使用兩種方式解決這個(gè)問題,如下所示。
- 設(shè)置任何人都可以寫 proxy_temp目錄,重啟 Nginx 即可解決。
- 直接更改proxy_temp_file_write_size的值,將其修改為大于圖片和文件的大小,重啟Nginx。
如果是以第一種方式解決問題的話,比如我的proxy_temp目錄是/usr/local/nginx/proxy_temp,用如下命令將/usr/local/nginx/proxy_temp目錄設(shè)置為任何人都可以寫,問題解決。
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;
}
當(dāng)然,我也幫這位讀者優(yōu)化了一些其他的配置項(xiàng)。
天津市犀思科技有限公司是專業(yè)從事web應(yīng)用定制開發(fā)的一家公司,主營(yíng)業(yè)務(wù)包括定制功能型網(wǎng)站建設(shè)開發(fā)、微信小程序開發(fā)、微信公眾號(hào)開發(fā)、APP定制開發(fā)、天津企業(yè)微信開發(fā)、ERP、CRM、OA等企業(yè)應(yīng)用場(chǎng)景信息化解決方案等服務(wù),致力于成為中國(guó)領(lǐng)先的IT服務(wù)及行業(yè)解決方案的提供商。

