1.如何配置基本緩存設置
開啓簡單的緩存配置,只需要兩個指令:proxy_cache_path
和proxy_cache
。proxy_cache_path
配置緩存的存放地址和其他的一些常用配置,proxy_cache
指令是爲了啓動緩存。
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_cache
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
給緩存數據定義一個鍵,例如
proxy_cache_key “$host$request_uri $cookie_user”;
默認情況下,該指令的值的字符串
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
(4)proxy_cache_methods
Syntax: proxy_cache_methods GET | HEAD | POST ...;
Default: proxy_cache_methods GET HEAD;
Context: http, server, location
該指令用於設置緩存哪些HTTP
方法,默認緩存HTTP GET/HEAD
方法,不緩存HTTP POST
方法.。
(5)proxy_cache_valid
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/disk1、/mnt/disk2、/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
會將臨時文件保存在緩存數據的同一目錄中。這是爲了避免在更新緩存時,磁盤之間互相複製響應數據。