Nginx緩存配置指南

1.如何配置基本緩存設置

開啓簡單的緩存配置,只須要兩個指令:proxy_cache_path和proxy_cache。proxy_cache_path配置緩存的存放地址和其餘的一些經常使用配置,proxy_cache指令是爲了啓動緩存。nginx

proxy_cache_path /path/to/cache levels=1:2 keys_zone=mycache:10m max_size=10g inactive=60m use_temp_path=off;
server {
  # ...
  location / {
    proxy_cache mycache;
    proxy_pass http://my_upstream;
  }
}

相關配置說明以下:緩存

  • /path/to/cache 本地路徑,用來設置Nginx緩存資源的存放地址
  • levels 默認全部緩存文件都放在同一個/path/to/cache下,可是會影響緩存的性能,所以一般會在/path/to/cache下面創建子目錄用來分別存放不一樣的文件。假設levels=1:2,Nginx爲將要緩存的資源生成的key爲f4cd0fbc769e94925ec5540b6a4136d0,那麼key的最後一位0,以及倒數第2-3位6d做爲兩級的子目錄,也就是該資源最終會被緩存到/path/to/cache/0/6d目錄中
  • key_zone 在共享內存中設置一塊存儲區域來存放緩存的key和metadata(相似使用次數),這樣nginx能夠快速判斷一個request是否命中或者未命中緩存,1m能夠存儲8000個key,10m能夠存儲80000個key
  • max_size 最大cache空間,若是不指定,會使用掉全部disk space,當達到配額後,會刪除最少使用的cache文件
  • inactive 未被訪問文件在緩存中保留時間,本配置中若是60分鐘未被訪問則不論狀態是否爲expired,緩存控制程序會刪掉文件。inactive默認是10分鐘。須要注意的是,inactive和expired配置項的含義是不一樣的,expired只是緩存過時,但不會被刪除,inactive是刪除指定時間內未被訪問的緩存文件
  • use_temp_path 若是爲off,則nginx會將緩存文件直接寫入指定的cache文件中,而不是使用temp_path存儲,official建議爲off,避免文件在不一樣文件系統中沒必要要的拷貝
  • proxy_cache 啓用proxy cache,並指定key_zone。另外,若是proxy_cache off表示關閉掉緩存。

 2.proxy_cache其餘相關指令集

(1)proxy_no_cachecookie

Syntax:proxy_no_cache string ...;
Default: — Context: http , server , location

該指令用於定義知足條件的響應不會被保存到緩存中。在條件字符串中至少有一個條件不爲空或者0,符合這樣條件的響應纔不會被緩存。舉例以下:負載均衡

proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache $http_pragma    $http_authorization;
其中, cookie_nocache、arg_nocache...皆爲變量,能夠根據你訪問的匹配策略來設置,其值只有2類,0和非0;
訪問匹配策略例如:
if ($request_uri ~ ^/(login|register|password\/reset)/) { set $cookie_nocache 1; }
若是在此鏈式配置中,只要有一個值不爲0,則不會cache;例如:
proxy_no_cache $cookie_nocache(0) $arg_nocache(1) $arg_comment(0)

則不會被cache。`性能

注:通常會配合proxy_cache_bypass共同使用;

(2)proxy_cache_bypass
Syntax: proxy_cache_bypass string ...;
Default: —
Context: http , server , location
該指令用於定義哪些狀況不從cache讀取,直接從backend獲取資源;配置方式同proxy_no_cache。
(3)proxy_cache_key
Syntax: proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location

給緩存數據定義一個鍵,例如spa

proxy_cache_key 「$host$request_uri $cookie_user」;

默認狀況下,該指令的值的字符串線程

proxy_cache_key $scheme$proxy_host$uri$is_args$args;

(4)proxy_cache_methods code

Syntax: proxy_cache_methods GET | HEAD | POST ...;
Default: proxy_cache_methods GET HEAD;
Context: http, server, location

該指令用於設置緩存哪些HTTP方法,默認緩存HTTP GET/HEAD方法,不緩存HTTP POST 方法.。server

(5)proxy_cache_validblog

Syntax: proxy_cache_valid [code ...] time;
Default:  —
Context:  http, server, location

設置不一樣響應碼的緩存時間,當不指定響應碼的時候,例如

proxy_cache_valid 5m;

只對響應碼爲200,301,302的訪問請求資源設置緩存時間,此外能夠個性化定製,例如:

proxy_cache_valid 200 302 10m; 
proxy_cache_valid 301 1h;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1m;

此外,還能夠在相應header裏設置優先級更高的緩存有效時間:

  • 「X-Accel-Expires」,設置響應的緩存過時時間,以秒爲單位;0爲不緩存;
  • 若是沒有設置「X-Accel-Expires」 header,則關於緩存的配置策略可能會在「Expires」或者「Cache-Control」 header中;
  • 若是header含有「Set-Cookie」,則響應不會被緩存,相似的配置能夠在「proxy_ignore_header」中可見;
  • header包含「Vary」而且設置爲「*」,則請求不會被緩存,若是「Vary」有具體的值,則對應的請求會被緩存;

(6)proxy_ignore_headers

Syntax:  proxy_ignore_headers field ...;
Default:  —
Context:  http, server, location
不緩存包含在field的響應header,能夠設置的值有:「X-Accel-Redirect」, 「X-Accel-Expires」, 「X-Accel-Limit-Rate」,「X-Accel-Buffering」, 「X-Accel-Charset」, 「Expires」, 「Cache-Control」, 「Set-Cookie」 (0.8.44), and 「Vary」。
若是上述的header field沒有設置爲忽略,則header filed中有「X-Accel-Expires」, 「Expires」, 「Cache-Control」, 「Set-Cookie」, and 「Vary」的話,響應會被緩存。

(7)proxy_cache_min_uses指令

Syntax:  proxy_cache_min_uses number;
Default: proxy_cache_min_uses 1;
Context: http, server, location

該指令用於設置緩存的最小使用次數,默認值爲1

3. nginx緩存擴展

(1)proxy_cache_use_stale加強站點容錯能力
源站有問題時,nginx能夠經過proxy_cache_use_stale指令開啓容錯能力,即便用緩存內容來響應客戶端的請求。舉例以下:
location / {  
    ...  
    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;  
}  

如上配置表示,看成爲cache的NGINX收到源站返回error、timeout或者其餘指定的5XX錯誤,而且在其緩存中有請求文件的陳舊版本,則會將這些陳舊版本的文件而不是錯誤信息發送給客戶端。

(2)多磁盤分割緩存
使用NGINX,不須要創建一個RAID(磁盤陣列)。若是有多個硬盤,NGINX能夠用來在多個硬盤之間分割緩存。舉例以下:
# 咱們假設每塊硬盤掛載在相應的目錄中:/mnt/disk一、/mnt/disk二、/mnt/disk3

proxy_cache_path /mnt/disk1 levels=1:2 keys_zone=cache_1:256m max_size=1024G use_temp_path=off;
proxy_cache_path /mnt/disk2 levels=1:2 keys_zone=cache_2:256m max_size=1024G use_temp_path=off;
proxy_cache_path /mnt/disk3 levels=1:2 keys_zone=cache_3:256m max_size=1024G use_temp_path=off;
split_clients $request_uri $disk {
    33.3%     1;
    33.3%     2;
    *         3;
}

location / {
    proxy_pass http://backend;
    proxy_cache_key $request_uri;
    proxy_cache cache_$disk;
}

在這份配置中,使用了3個獨立的緩存,每一個緩存專用一塊硬盤,另外,3個獨立的線程池也各自專用一塊硬盤。
緩存之間(其結果就是磁盤之間)的負載均衡使用split_clients模塊,split_clients很是適用於這個任務。
在 proxy_cache_path指令中設置use_temp_path=off,表示NGINX會將臨時文件保存在緩存數據的同一目錄中。這是爲了不在更新緩存時,磁盤之間互相複製響應數據。

相關文章
相關標籤/搜索