原文連接:何曉東 博客php
使用場景:項目的頁面須要加載不少數據,也不是常常變化的,不涉及個性化定製,爲每次請求去動態生成數據,性能比不上根據請求路由和參數緩存一下結果,使用 Nginx 緩存將大幅度提高請求速度。
只須要配置 proxy_cache_path
和 proxy_cache
就能夠開啓內容緩存,前者用來設置緩存的路徑和配置,後者用來啓用緩存。nginx
http { ... 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 mycache; location / { proxy_pass http://localhost:8000; } } }
對應參數說明:
1.用於緩存的本地磁盤目錄是 /path/to/cache/git
2.levels 在 /path/to/cache/ 設置了一個兩級層次結構的目錄。將大量的文件放置在單個目錄中會致使文件訪問緩慢,因此針對大多數部署,咱們推薦使用兩級目錄層次結構。若是 levels 參數沒有配置,則 NGINX 會將全部的文件放到同一個目錄中。github
3.keys_zone 設置一個共享內存區,該內存區用於存儲緩存鍵和元數據,有些相似計時器的用途。將鍵的拷貝放入內存可使 NGINX 在不檢索磁盤的狀況下快速決定一個請求是 HIT
仍是 MISS
,這樣大大提升了檢索速度。一個 1MB 的內存空間能夠存儲大約 8000 個 key,那麼上面配置的 10MB 內存空間能夠存儲差很少 80000 個key。緩存
4.max_size 設置了緩存的上限(在上面的例子中是 10G)。這是一個可選項;若是不指定具體值,那就是容許緩存不斷增加,佔用全部可用的磁盤空間。當緩存達到這個上線,處理器便調用 cache manager 來移除最近最少被使用的文件,這樣把緩存的空間下降至這個限制之下。服務器
5.inactive 指定了項目在不被訪問的狀況下可以在內存中保持的時間。在上面的例子中,若是一個文件在 60 分鐘以內沒有被請求,則緩存管理將會自動將其在內存中刪除,無論該文件是否過時。該參數默認值爲 10 分鐘(10m)。注意,非活動內容有別於過時內容。NGINX 不會自動刪除由緩存控制頭部指定的過時內容(本例中Cache-Control:max-age=120)。過時內容只有在 inactive 指定時間內沒有被訪問的狀況下才會被刪除。若是過時內容被訪問了,那麼 NGINX 就會將其從原服務器上刷新,並更新對應的 inactive 計時器。cookie
6.NGINX 最初會將註定寫入緩存的文件先放入一個臨時存儲區域, use_temp_path=off 命令指示 NGINX 將在緩存這些文件時將它們寫入同一個目錄下。咱們強烈建議你將參數設置爲 off 來避免在文件系統中沒必要要的數據拷貝。use_temp_path 在 NGINX1.7 版本和 NGINX Plus R6 中有所介紹。session
最終,proxy_cache 命令啓動緩存那些 URL 與 location 部分匹配的內容(本例中,爲/
)。你一樣能夠將 proxy_cache 命令添加到 server 部分,這將會將緩存應用到全部的那些 location 中未指定本身的 proxy_cache 命令的服務中。curl
緩存中還涉及兩個額外的NGINX進程:ide
cache loader 只運行一次,NGINX 開始以後。它將有關之前緩存的數據的元數據加載到共享內存區域。一次加載整個緩存可能會消耗足夠的資源來在啓動後的最初幾分鐘內下降 NGINX 的性能。要避免這種狀況,請經過在 proxy_cache_path 指令中包含如下參數來配置緩存的迭代加載:
在如下示例中,迭代持續數300 毫秒或直到 200 個項目被加載進去:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
配置示例:
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { ... location / { proxy_cache my_cache; # proxy_cache_key "$host$request_uri$cookie_user"; proxy_cache_min_uses 3; proxy_cache_methods GET HEAD POST; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; # proxy_cache_valid any 5m; proxy_pass http://localhost:8000; } }
對應參數說明:proxy_cache_key
爲更改計算密鑰時使用的請求特徵,指定緩存的 key,這個不推薦,示例是使用域名,請求url,用戶 cookie 來看成 key,意味着一個頁面將爲不一樣的用戶緩存 n 次,絕大多數狀況不須要這樣的操做。proxy_cache_min_uses
爲在緩存響應以前必須使用相同密鑰的請求的最小次數。proxy_cache_methods
爲指定要被緩存的請求方式的響應值,默認爲 GET 和 HEAD,新增其餘的須要一塊兒列出來,如上示例所示。proxy_cache_valid
爲響應狀態碼的緩存時間,示例能夠爲每一個狀態碼緩存指定時間,也可使用 any 進行所有狀態碼的緩存。
須要提早加一個配置,用於標識使用 HTTP PURGE 方法的請求並刪除匹配的 URL 對應的緩存。<br/>
1.在 http {}
上下文中建立新變量,例如 $purge_method
, 他依賴於 $request_method
變量:
http { ... map $request_method $purge_method { PURGE 1; default 0; } }
2.在 location {}
塊中,已經配置緩存的前提下,引入 proxy_cache_purge
參數來指定清除緩存請求的條件。例如在上一步指定的 $request_method
server { listen 80; server_name www.example.com; location / { proxy_pass https://localhost:8002; proxy_cache mycache; proxy_cache_purge $purge_method; } }
配置完並使之生效以後,就能夠發送一條 purge 請求來讓緩存失效了,例如:
curl -X PURGE -D – "https://www.example.com/*"
在該示例中,將清除具備公共 URL 部分(由星號通配符指定)的資源。但這些緩存條目不會從緩存中徹底刪除:它們會保留在磁盤上,直到它們被視爲不活動(由proxy_cache_path
中的 inactive
參數決定)的時候才徹底刪除,或緩存清除器(由 proxy_cache_path
中的 purge
決定),或客戶端嘗試訪問它們的時候。
參考連接:
更多文章會更新在我的博客上。