Nginx 靜態檔案服務

2022-04-25 03:01:07 字數 4048 閱讀 8110

我們先來看看最簡單的本地靜態檔案服務配置示例:

server
就這些?恩,就這些!如果只是提供簡單的對外靜態檔案,它真的就可以用了。可是他不完美,遠遠沒有發揮 nginx 的半成功力,為什麼這麼說呢,看看下面的配置吧,為了大家看著方便,我們把每一項的作用都做了注釋。

}乙個 web 快取坐落於客戶端和原始伺服器(origin server)中間,它保留了所有可見內容的拷貝。如果乙個客戶端請求的內容在快取中儲存,則可以直接在快取中獲得該內容而不需要與伺服器通訊。這樣一來,由於 web 快取距離客戶端「更近」,就可以提高響應效能,並更有效率的使用應用伺服器,因為伺服器不用每次請求都進行頁面生成工作。

在瀏覽器和應用伺服器之間,存在多種潛在快取,如:客戶端瀏覽器快取、中間快取、內容分發網路(cdn)和伺服器上的負載平衡和反向**。快取,僅在反向**和負載均衡的層面,就對效能提高有很大的幫助。

舉個例子說明,去年,我接手了一項任務,這項任務的內容是對乙個載入緩慢的**進行效能優化。首先引起我注意的事情是,這個**差不多花費了超過 1 秒鐘才生成了主頁。經過一系列除錯,我發現載入緩慢的原因在於頁面被標記為不可快取,即為了響應每乙個請求,頁面都是動態生成的。由於頁面本身並不需要經常性的變更,並且不涉及個性化,那麼這樣做其實並沒有必要。為了驗證一下我的結論,我將頁面標記為每 5 秒快取一次,僅僅做了這乙個調整,就能明顯的感受到效能的提公升。第乙個位元組到達的時間降低到幾毫秒,同時頁面的載入明顯要更快。

並不是只有大規模的內容分發網路(cdn)可以在使用快取中受益——快取還可以提高負載平衡器、反向**和應用伺服器前端 web 服務的效能。通過上面的例子,我們看到,快取內容結果,可以更高效的使用應用伺服器,因為不需要每次都去做重複的頁面生成工作。此外,web 快取還可以用來提高**可靠性。當伺服器宕機或者繁忙時,比起返回錯誤資訊給使用者,不如通過配置 nginx 將已經快取下來的內容傳送給使用者。這意味著,**在應用伺服器或者資料庫故障的情況下,可以保持部分甚至全部的功能運轉。

下面討論如何安裝和配置 nginx 的基礎快取(basic caching)。

我們只需要兩個命令就可以啟用基礎快取:proxy_cache_path 和 proxy_cache。proxy_cache_path 用來設定快取的路徑和配置,proxy_cache 用來啟用快取。

proxy_cache_path/path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m

use_temp_path=off;

server

}

proxy_cache_path 命令中的引數及對應配置說明如下:

用於快取的本地磁碟目錄是 /path/to/cache/

levels 在 /path/to/cache/ 設定了乙個兩級層次結構的目錄。將大量的檔案放置在單個目錄中會導致檔案訪問緩慢,所以針對大多數部署,我們推薦使用兩級目錄層次結構。如果 levels 引數沒有配置,則 nginx 會將所有的檔案放到同乙個目錄中。

keys_zone 設定乙個共享記憶體區,該記憶體區用於儲存快取鍵和元資料,有些類似計時器的用途。將鍵的拷貝放入記憶體可以使 nginx 在不檢索磁碟的情況下快速決定乙個請求是hit還是miss,這樣大大提高了檢索速度。乙個 1mb 的記憶體空間可以儲存大約 8000 個 key,那麼上面配置的 10mb 記憶體空間可以儲存差不多 80000 個 key。

max_size 設定了快取的上限(在上面的例子中是 10g)。這是乙個可選項;如果不指定具體值,那就是允許快取不斷增長,占用所有可用的磁碟空間。當快取達到這個上限,處理器便呼叫 cache manager 來移除最近最少被使用的檔案,這樣把快取的空間降低至這個限制之下。

inactive 指定了專案在不被訪問的情況下能夠在記憶體中保持的時間。在上面的例子中,如果乙個檔案在 60 分鐘之內沒有被請求,則快取管理將會自動將其在記憶體中刪除,不管該檔案是否過期。該引數預設值為 10 分鐘(10m)。注意,非活動內容有別於過期內容。nginx 不會自動刪除由快取控制頭部指定的過期內容(本例中 cache-control:max-age=120)。過期內容只有在 inactive 指定時間內沒有被訪問的情況下才會被刪除。如果過期內容被訪問了,那麼 nginx 就會將其從原伺服器上重新整理,並更新對應的 inactive 計時器。

nginx 最初會將注定寫入快取的檔案先放入乙個臨時儲存區域,use_temp_path=off 命令指示 nginx 將在快取這些檔案時將它們寫入同乙個目錄下。我們強烈建議你將引數設定為 off 來避免在檔案系統中不必要的資料拷貝。use_temp_path 在 nginx 1.7 版本和 nginx plus r6 中有所介紹。

最終,proxy_cache 命令啟動快取那些 url 與 location 部分匹配的內容(本例中,為/)。你同樣可以將 proxy_cache 命令新增到 server 部分,這將會將快取應用到所有的那些 location 中未指定自己的 proxy_cache 命令的服務中。

nginx 內容快取的乙個非常強大的特性是:當無法從原始伺服器獲取最新的內容時,nginx 可以分發快取中的陳舊(stale,編者注:即過期內容)內容。這種情況一般發生在關聯快取內容的原始伺服器宕機或者繁忙時。比起對客戶端傳達錯誤資訊,nginx 可傳送在其記憶體中的陳舊的檔案。nginx 的這種**方式,為伺服器提供額外級別的容錯能力,並確保了在伺服器故障或流量峰值的情況下的正常執行。為了開啟該功能,只需要新增 proxy_cache_use_stale 命令即可:

location /
按照上面例子中的配置,當 nginx 收到伺服器返回的 error,timeout 或者其他指定的 5xx 錯誤,並且在其快取中有請求檔案的陳舊版本,則會將這些陳舊版本的檔案而不是錯誤資訊傳送給客戶端。

nginx 提供了豐富的可選項配置用於快取效能的微調。下面是使用了幾個配置的例子:

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m

use_temp_path=off;

server

}

這些命令配置了下列的行為:

proxy_cache_revalidate 指示 nginx 在重新整理來自伺服器的內容時使用 get 請求。如果客戶端的請求項已經被快取過了,但是在快取控制頭部中定義為過期,那麼 nginx 就會在 get 請求中包含 if-modified-since 字段,傳送至伺服器端。這項配置可以節約頻寬,因為對於 nginx 已經快取過的檔案,伺服器只會在該檔案請求頭中 last-modified 記錄的時間內被修改時才將全部檔案一起傳送。

proxy_cache_min_uses 該指令設定同一鏈結請求達到幾次即被快取,預設值為 1 。當快取不斷被填滿時,這項設定便十分有用,因為這確保了只有那些被經常訪問的內容會被快取。

當 proxy_cache_lock 被啟用時,當多個客戶端請求乙個快取中不存在的檔案(或稱之為乙個 miss),只有這些請求中的第乙個被允許傳送至伺服器。其他請求在第乙個請求得到滿意結果之後在快取中得到檔案。如果不啟用 proxy_cache_lock,則所有在快取中找不到檔案的請求都會直接與伺服器通訊。

使用 nginx 不需要建立乙個 raid(磁碟陣列)。如果有多個硬碟,nginx 可以用來在多個硬碟之間分割快取。下面是乙個基於請求 uri 跨越兩個硬碟之間均分快取的例子:

proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m max_size=10g

inactive=60m use_temp_path=off;

proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m max_size=10g inactive=60m use_temp_path=off;

split_clients $request_uri $my_cache

server

}

Nginx 靜態檔案服務

我們先來看看最簡單的本地靜態檔案服務配置示例 server就這些?恩,就這些!如果只是提供簡單的對外靜態檔案,它真的就可以用了。可是他不完美,遠遠沒有發揮 nginx 的半成功力,為什麼這麼說呢,看看下面的配置吧,為了大家看著方便,我們把每一項的作用都做了注釋。乙個 web 快取坐落於客戶端和原始伺...

nginx 靜態檔案快取

目的 快取nginx伺服器的靜態檔案。如css,js,htm,html,jpg,gif,png,flv,swf,這些檔案都不是經常更新。便於快取以減輕伺服器的壓力。實現 nginx proxy cache可以將使用者的請快取到本地乙個目錄,當下乙個請求時可以直接調取快取檔案,就不用去後端伺服器去取檔...

nginx 靜態檔案快取

目的 快取nginx伺服器的靜態檔案。如css,js,htm,html,jpg,gif,png,flv,swf,這些檔案都不是經常更新。便於快取以減輕伺服器的壓力。實現 nginx proxy cache可以將使用者的請快取到本地乙個目錄,當下乙個請求時可以直接調取快取檔案,就不用去後端伺服器去取檔...