寫在前面
最近,一名讀者跟我說他經過瀏覽器訪問本身的服務器時,圖片顯示的很是慢,以致於在瀏覽器中都沒法徹底加載出來,下載文件時,更是惱火,文件根本就沒法徹底下載下來。並且奇怪的是這位讀者所在的網絡是沒啥問題的。因而,我便開始幫他排查各類問題。。。html
問題定位
通過一系列的排查(中間過程我就省略了,直接寫重點了!),最終定位到是Nginx的問題。當我打開這位讀者的網站後臺管理系統,發現圖片顯示很是慢,在Nginx前端代理上查出以下錯誤信息。前端
[error] 28423#0: *5 connect() failed (111: Connection refused) while connecting to upstream
直接在後臺服務器上用後臺服務器的IP地址去訪問,發現速度至關快,因而懷疑是Nginx的配置問題。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之間。bash
問題就出在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; }
固然,我也幫這位讀者優化了一些其餘的配置項。
好了,今天就聊到這兒吧!別忘了點個贊,給個在看和轉發,讓更多的人看到,一塊兒學習,一塊兒進步!!
寫在最後
若是你以爲冰河寫的還不錯,請微信搜索並關注「 冰河技術 」微信公衆號,跟冰河學習高併發、分佈式、微服務、大數據、互聯網和雲原生技術,「 冰河技術 」微信公衆號更新了大量技術專題,每一篇技術文章乾貨滿滿!很多讀者已經經過閱讀「 冰河技術 」微信公衆號文章,吊打面試官,成功跳槽到大廠;也有很多讀者實現了技術上的飛躍,成爲公司的技術骨幹!若是你也想像他們同樣提高本身的能力,實現技術能力的飛躍,進大廠,升職加薪,那就關注「 冰河技術 」微信公衆號吧,天天更新超硬核技術乾貨,讓你對如何提高技術能力再也不迷茫!