1. 程式人生 > >Nginx快取的兩種方式

Nginx快取的兩種方式

這裡 Cache 有兩種情況說明,一種是瀏覽器訪問Nginx,瀏覽器會Cache;一種是Nginx 訪問後端,Nginx 自己Cache 。

第一種情況

來個例子:

$ curl -I http://www.12reads.cn
HTTP/1.1 200 OK
Server: JSP3/2.0.4
Date: Fri, 31 Oct 2014 07:28:20 GMT
Content-Type: text/css
Content-Length: 25076
Connection: keep-alive
ETag: “1121644245”
Last-Modified: Wed, 24 Sep 2014 15:50:22 GMT
Expires: Mon, 23 Mar 2015 16:29:25 GMT


Age: 3164335
Cache-Control: max-age=15552000
Accept-Ranges: bytes
Vary: Accept-Encoding

先多句嘴說說Date 和 Age 的意思,Date 的意思是伺服器傳送訊息的時間; Age 的意思有點複雜,它的存在暗示你訪問的伺服器不是源伺服器,而是一臺快取伺服器,Age 的大小表示這個資源已經”存活了”多長時間,所以這個值不會大於 源伺服器設定的最大快取時間。

這裡Expires 表示過期時間,Cache-Control 表示最大的存活時間,在伺服器端的Nginx 我們可以用 expires 指令來定義這兩項。

比如:
expire -1;


expire 0;
expire 1h;
expire max;
expire off;

這個指令表示在HTTP響應頭中是否增加或修改Expires 和 Cache-Control ,僅當響應狀態是200, 201, 204, 206, 301, 302, 303, 304, 或者 307的時候有效。

當expire 為負時,會在響應頭增加Cache-Control: no-cache;

當為正或者0時,就表示Cache-Control: max-age=指定的時間(秒);

當為max時,會把Expires設定為 “Thu, 31 Dec 2037 23:55:55 GMT”, Cache-Control 設定到 10 年;

當為off時,表示不增加或修改Expires 和 Cache-Control 。

另外,瀏覽器可以通過兩種方式來判斷快取檔案是否被更新了,一種是 If-Modified-Since ,瀏覽器通過傳送If-Modified-Since 頭,帶上「上一次請求獲得的修改時間,(在Last-Modified頭裡)」傳送到伺服器,伺服器會判斷這個時間之後檔案有沒有改變,如果沒有改變返回狀態值304,如果有返回新檔案,狀態值200 。

還有一種是利用Etag(Entity Tag),它是實體內容的hash字串(md5或者SHA1的演算法計算出來的),這個方法更準確但是更消耗伺服器的CPU,瀏覽器傳送If-None-Match 頭,裡面是Etag值(瀏覽器之前請求檔案時,伺服器會返回Etag 頭),伺服器收到後做比較,如果一樣就返回304,不一樣也傳送最新檔案,返回值200。(本文由管理學書籍 http://www.12reads.cn/ 原創)

第二種情況

 一般先在http 裡面定義一個快取路徑:

[text]
proxy_buffering on;
proxy_cache_path $cache_path/m_wdjcdn_com levels=1:2 keys_zone=m_wdjcdn_com:512m inactive=20d max_size=300G;

[/text]

然後在server 的 location 裡來使用快取,比如:

[text]

proxy_cache m_wdjcdn_com;
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_valid 200 301 302 20m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout invalid_header updating;
proxy_cache_min_uses 1;
proxy_cache_revalidate on;
[/text]

要注意,proxy_cache在proxy_buffering 開啟之後才有效,否則不會快取

proxy_cache_path 的levels 定義目錄層次結構;inactive 表示資料沒被訪問多長時間後從快取中刪除;快取大小超過max_size之後使用LRU演算法刪除資料。

proxy_cache 定義使用哪個zone;
proxy_cache_key 定義快取key;
proxy_cache_valid 不同狀態碼快取不同時間;
proxy_cache_use_stale 定義後端伺服器在何種情況下Nginx 返回過期的快取;
proxy_cache_min_uses 請求多少次之後才會被快取;
proxy_cache_revalidate 表示資源過期後是否使用If-Modified-Since 和If-None-Match來確認資源是否改變。

另外,還有一個指令 proxy_cache_purge,它用於清除快取,比如下面的配置:

[text]location ~ /purge(/.*) {
proxy_cache_purge m_wdjcdn_com ""$scheme$host$1";
}[/text]

如果訪問/purge/nosa.png,就把nosa.png的快取清除了,這個功能可用於重新整理快取。

最後再看下關於 proxy_cache_use_stale 的官方解釋:

This directive tells Nginx when to serve a stale item from the proxy cache. The parameters for this directive are similar to proxy_next_upstream with the addition of ‘updating’.

To prevent cache stampedes (when multiple threads stampede in to try to update the cache simultaneously) you can specify the ‘updating‘ parameter. This will cause one thread to update the cache and while the update is in progress all other threads will serve the stale version of what is in the cache.