nginx之頁(yè)面緩存
1.指令說(shuō)明
proxy_cache_path
語(yǔ)法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];?
默認(rèn)值:none?
使用字段:http?
指令指定緩存的路徑和一些其他參數(shù),緩存的數(shù)據(jù)存儲(chǔ)在文件中,并且使用代理url的哈希值作為關(guān)鍵字與文件名。levels參數(shù)指定緩存的子目錄數(shù),例如:
proxy_cache_path?/data/nginx/cache?levels=1:2??keys_zone=one:10m;
文件名類似于:
/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
levels指定目錄結(jié)構(gòu),可以使用任意的1位或2位數(shù)字作為目錄結(jié)構(gòu),如 x, x:x,或x:x:x 例如: “2”, “2:2”, “1:1:2“,但是最多只能是三級(jí)目錄。?
所有活動(dòng)的key和元數(shù)據(jù)存儲(chǔ)在共享的內(nèi)存池中,這個(gè)區(qū)域用keys_zone參數(shù)指定。one指的是共享池的名稱,10m指的是共享池的大小。?
注意每一個(gè)定義的內(nèi)存池必須是不重復(fù)的路徑,例如:
proxy_cache_path?/data/nginx/cache/one??levels=1???keys_zone=one:10m; proxy_cache_path?/data/nginx/cache/two??levels=2:2??keys_zone=two:100m; proxy_cache_path?/data/nginx/cache/three?levels=1:1:2?keys_zone=three:1000m;
如果在inactive參數(shù)指定的時(shí)間內(nèi)緩存的數(shù)據(jù)沒(méi)有被請(qǐng)求則被刪除,默認(rèn)inactive為10分鐘。一個(gè)名為cache manager的進(jìn)程控制磁盤的緩存大小,它被用來(lái)刪除不活動(dòng)的緩存和控制緩存大小,這些都在max_size參數(shù)中定義,當(dāng)目前緩存的值超出max_size指定的值之后,超過(guò)其大小后最少使用數(shù)據(jù)(lru替換算法)將被刪除。內(nèi)存池的大小按照緩存頁(yè)面數(shù)的比例進(jìn)行設(shè)置,一個(gè)頁(yè)面(文件)的元數(shù)據(jù)大小按照操作系統(tǒng)來(lái)定,如freebsd/i386下為64字節(jié),freebsd/amd64下為128字節(jié)。
proxy_cache
語(yǔ)法:proxy_cache zone_name;?
默認(rèn)值:none?
使用字段:http, server, location?
設(shè)置一個(gè)緩存區(qū)域的名稱,一個(gè)相同的區(qū)域可以在不同的地方使用。?
在0.7.48后,緩存遵循后端的”expires”, “cache-control: no-cache”, “cache-control: max-age=xxx”頭部字段,0.7.66版本以后,”cache-control:“private”和”no-store”頭同樣被遵循。nginx在緩存過(guò)程中不會(huì)處理”vary”頭,為了確保一些私有數(shù)據(jù)不被所有的用戶看到,后端必須設(shè)置 “no-cache”或者”max-age=0”頭,或者proxy_cache_key包含用戶指定的數(shù)據(jù)如$Cookie_xxx,使用cookie的值作為proxy_cache_key的一部分可以防止緩存私有數(shù)據(jù),所以可以在不同的location中分別指定proxy_cache_key的值以便分開(kāi)私有數(shù)據(jù)和公有數(shù)據(jù)。?
緩存指令依賴代理緩沖區(qū)(buffers),如果proxy_buffers設(shè)置為off,緩存不會(huì)生效。
proxy_cache_valid
語(yǔ)法:proxy_cache_valid reply_code [reply_code …] time;?
默認(rèn)值:none?
使用字段:http, server, location?
為不同的應(yīng)答設(shè)置不同的緩存時(shí)間,例如:
proxy_cache_valid?200?302?10m; proxy_cache_valid?404???1m;
為應(yīng)答代碼為200和302的設(shè)置緩存時(shí)間為10分鐘,404代碼緩存1分鐘。?
如果只定義時(shí)間:
proxy_cache_valid?5m;
那么只對(duì)代碼為200, 301和302的應(yīng)答進(jìn)行緩存。?
同樣可以使用any參數(shù)任何應(yīng)答。
proxy_cache_valid?200?302?10m; proxy_cache_valid?301?1h; proxy_cache_valid?any?1m;
2.定義一個(gè)簡(jiǎn)單nginx緩存服務(wù)器
[root@nginx?~]#?vim?/etc/nginx/nginx.conf proxy_cache_path?/data/nginx/cache/webserver?levels=1:2?keys_zone=webserver:20m?max_size=1g; ??server?{ ????listen????80; ????server_name?localhost; ????#charset?koi8-r; ????#access_log?logs/host.access.log?main; ????location?/?{ ????????proxy_pass???http://webservers; ????????proxy_set_header?x-real-ip?$remote_addr; ????????proxy_cache?webserver; ????????proxy_cache_valid?200?10m; ????} }
3.新建緩存目錄
[root@nginx?~]#?mkdir?-pv?/data/nginx/cache/webserver
4.重新加載一下配置文件
[root@nginx?webserver]#?service?nginx?reload nginx:?the?configuration?file?/etc/nginx/nginx.conf?syntax?is?ok nginx:?configuration?file?/etc/nginx/nginx.conf?test?is?successful 重新載入?nginx:??????????????????????[確定]
5.下面我們來(lái)測(cè)試一下(谷歌瀏覽器)
注,大家用谷歌瀏覽器測(cè)試的時(shí)候,可以按f12調(diào)用開(kāi)發(fā)工具,選擇network選項(xiàng),我們可以看到,response headers,在這里我們可以看到,我們請(qǐng)求的是否是緩存,但現(xiàn)在還看不到,下面我們來(lái)配置一下,再來(lái)測(cè)試。
6. 緩存變量說(shuō)明
$server_addr
服務(wù)器地址,在完成一次系統(tǒng)調(diào)用后可以確定這個(gè)值,如果要繞開(kāi)系統(tǒng)調(diào)用,則必須在listen中指定地址并且使用bind參數(shù)。
$upstream_cache_status
0.8.3版本中其值可能為:
-
miss 未命中
-
expired – expired。請(qǐng)求被傳送到后端。
-
updating – expired。因?yàn)閜roxy/fastcgi_cache_use_stale正處于更新中,所以將使用舊版本的響應(yīng)。
-
stale – expired。當(dāng)使用proxy/fastcgi_cache_use_stale時(shí),后端會(huì)接收到過(guò)期的響應(yīng)。
-
hit 命中
[root@nginx?~]#?vim?/etc/nginx/nginx.conf proxy_cache_path?/data/nginx/cache/webserver?levels=1:2?keys_zone=webserver:20m?max_size=1g; ??server?{ ????listen????80; ????server_name?localhost; ????#charset?koi8-r; ????#access_log?logs/host.access.log?main; ????#增加兩頭部 ????add_header?x-via?$server_addr; ????add_header?x-cache?$upstream_cache_status; ????location?/?{ ????????proxy_pass???http://webservers; ????????proxy_set_header?x-real-ip?$remote_addr; ????????proxy_cache?webserver; ????????proxy_cache_valid?200?10m; ????} }
7.重新加載一下配置文件
[root@nginx?~]#?service?nginx?reload nginx:?the?configuration?file?/etc/nginx/nginx.conf?syntax?is?ok nginx:?configuration?file?/etc/nginx/nginx.conf?test?is?successful 重新載入?nginx:??????????????????????[確定]
8.測(cè)試一下
注,從圖中我們可以看到,我們?cè)L問(wèn)的服務(wù)器是192.168.18.208,緩存命中。大家可以看到是不是很直觀啊。下面我們看一下緩存目錄。
9.查看一下緩存目錄
[root@nginx?~]#?cd?/data/nginx/cache/webserver/f/63/ [root@nginx?63]#?ls 681ad4c77694b65d61c9985553a2763f
注,緩存目錄里確實(shí)有緩存文件。