聲明:文中內容來自如下四個部分的學習筆記總結: php
1.馬哥教育馬永亮老師講授的varnish課程 css
2.高俊峯先生寫的書籍《高性能Linux服務器構建實戰》中的varnish章節 html
3.陳明乾先生的51cto博客:http://freeloda.blog.51cto.com/2033581/1297414 web
4.互聯網文檔。 正則表達式
特此向以上先賢致敬!! 編程
內容歸納: vim
一 varnish 簡要歸納 後端
Varnish是一款輕量級的Cache和反向代理軟件。 瀏覽器
官方網站:https://www.varnish-cache.org/ (家中的廣電寬帶打不開該站點,不知是否是被牆了) 緩存
二 varnish同squid相比
相同點:
都是開源軟件
均可作爲緩存和發向代理軟件使用
varnish的優勢:
varnish訪問速度快。varnish將數據緩存在內存中,squid將緩存數據放置在磁盤上。
varnish可使用管理接口,使用正則表達式修剪緩存數據,squid作不到。
varnish支持更多的併發鏈接。varnish的TCP鏈接釋放速度高於squid,在高併發的狀況下支持更多的TCP鏈接。
varnish的缺點:
varnish的進程一旦崩潰,重啓,緩存在內存中的數據將會丟失,來自前段的訪問流量涌向後端
varnish在負載較大的狀況下,沒有squid穩定。
三 varnish設計結構
varnish運行的兩類進程:management進程和child/cache進程。
3.1)management進程做用:
編譯VCL書寫的策略,應用新的配置,初始化varnish,監控child進程,提供管理接口
management進程間隔數秒探測child進程,若timeout時間內沒有得到迴應,會重啓child進程。
management提供的管理接口有三種:命令行接口和telnet遠程接口,還有gui圖形接口(要收費的)。
3.2)child/cache進程做用:
使用accept線程:接收新的鏈接請求並響應
使用worker線程:child爲每個會話啓用一個worker線程,在高併發場景中會有多個worker線程存在。
使用expiry線程:從緩存中清理過時的內容
使用Log/stats線程:管理日誌
使用command line線程:管理接口
使用storage/hashing線程:管理存儲
使用backend communication線程:管理後端主機
3.3)日誌管理:
varnish的日誌是共享內存日誌,線程若想寫日誌記錄信息,需維持持有一個鎖,而後向共享內存中的日誌區域寫入數據,而後再釋放鎖。對應worker 線程,使用了日誌數據緩存功能,防止日誌寫入競爭。共享日誌大小通常爲90M,分爲2個部分:前一部分爲計數器,後一部分爲客戶端請求數據。
四 varnish的工做流程:
圖中橢圓形部分稱爲varnish的狀態節點,又稱爲狀態引擎,還有種叫法爲varnish的內置函數。
圖中紅色的線條:沒有查詢緩存/緩存中數據過時/緩存中沒有數據 狀況下的流程
圖中黃顏色的線條:直接將匹配數據經過內置函數vcl_pipe送日後臺主機的流程
圖中綠色的線條:查詢緩存數據命中且數據沒有過時/經後臺主機返回的數據經被緩存後返回給客戶流程
圖中藍色的線條:數據沒有命中緩存向後臺主機發出查詢的流程
圖中黑色的線條:數據從後臺主機返回給varnish緩存的流程
圖中內置函數的做用:
4.1)vcl_recv:用於接收和處理請求,請求到達並被成功接受後被調用。
四個主要用途:
修改客戶端請求數據減小緩存對象差別性:好比刪除URL中的www.字符
基於客戶端數據選用緩存策略:不如不緩存POST請求,
爲web應用程序執行URL重寫規則
挑選合適的後端服務器
常用的終止語句:
pass:繞過緩存,不從緩存中查詢內容或不將內容存儲至緩存
pipe:不對客戶端進行檢查或作出任何操做,而是在客戶端與後臺服務間創建「管道「進行數據傳輸。
lookup:在緩存中查找用戶請求的對象
error :格式:error code [reason] ,向客戶端返回一個錯誤代碼code 和 緣由resion,該reason可自定義
4.2)vcl_pipe:將請求直接傳遞至後端主機,在請求和返回的內容沒有改變的狀況下,將不變的內容傳遞給客戶端,直到這個連接被關閉。
常用的終止語句:
pipe:說明見上
error code [reason]:說明見上
4.3)vcl_hash: 在緩存中進行查詢
4.4)vcl_hit:在緩存中找到請求的內容
常用的終止語句:
deliver:將找到的內容發送給客戶端,把控制權交個函數vcl_deliver
error code [reason]:說明見上
pass:將控制權交個vcl_pass函數處理,多是緩存中數據過時所致
4.5)vcl_miss:當在緩存中沒有找到匹配數據時被調用
常用的結束語:
error code [reason]:說明見上
pass:說明見上
fetch:表示從後端獲取的請求的內容,並將控制權交給VCL_fetch函數
4.6)vcl_pass:將請求直接傳遞給後端主機,後端主機將應答數據發送給客戶端,而不執行緩存,每次都返回最新內容。
常用的結束語:
error code [reason]:說明見上
fetch:說明見上
4.7)vcl_fetch:向後端主機獲取內容,經過判斷將內容放入緩存,仍是直接返回給客戶端。
常常用的結束語:
error code [reason]:說明見上
deliver:將控制器交給vcl_deliver函數,將數據返回給客戶端
hit_no_pass:不緩存數據,直接返回給客戶端
4.8)vcl_deliver函數:將緩存中找到的數據返回給客戶端
常用的結束語:
error code [reason]:說明見上
deliver:將內容返回給客戶端
五 vcl語句的書寫要素:
Varnish Configuration Language(vcl)是varnish配置的緩存策略工具。
是一種基於」域「的簡單編程語言;
有內置的衆多變量和 set 自定義變量可使用;
支持if判斷語句,不支持循環語句;
支持使用varnish內置函數的結束語,而沒有返回值;
支持:=,==,~,!,&&,|| 邏輯操做符
使用://,#,/*comment*/ 表示註釋
使用:sub $NAME { }用於定義函數
5.1) vcl編寫的緩存策略---->management線程進行分析---->調用gcc編譯器--->編譯成二進制程序-->chaild/cache線程調用
5.2)vcl策略被編譯使用的操做:
假設vcl策略被定義在/etc/varnish/default.vcl文件中,varnishadm命令在安裝varnish後會生成。
#varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
>vcl.list
---->顯示如今使用的或者可使用的vcl 配置
>vcl.load test1 default.vcl
---->執行編譯,加載/etc/varnish/default.vcl,並定義被編譯後的vcl策略版本名爲test1
>vcl.use test1
---->將varnish如今使用的vcl策略版本切換使用test1所表明的配置
>help
----->列出該模式下可使用的命令
5.3)vcl中內置的變量(全面的內置變量請參考官方站點文檔):
(1)在任何引擎中都可使用:
now:獲取當前時間
.host:後端主機的主機名
.port:後端主機的端口號
(2)用於處理請求階段:
client.ip:客戶端IP地址
server.hostname:varnish的主機名
server.ip:varnish的ip地址
server.port:varnish的端口號
req.request:請求方法
req.url: 請求的URL
req.proto: HTTP協議版本
req.backend: 用於服務這次請求的後端主機;
req.backend.healthy: 後端主機健康狀態;
req.http.HEADER: 引用請求報文中指定的首部;
req.can_gzip:客戶端是否可以接受gzip壓縮格式的響應內容;
req.restarts: 此請求被重啓的次數;
(3)varnish向backend主機發起請求前可用的變量
bereq.request: 請求方法
bereq.url:請求的URL
bereq.proto:HTTP的協議版本
bereq.http.HEADER:請求報文中指定的首部
bereq.connect_timeout: 等待與backend主機創建鏈接的超時時長
(4)backend主機的響應報文到達本主機(varnish)後,將其放置於cache中以前可用的變量
beresp.do_stream: 流式響應;
beresp.do_gzip:是否壓縮以後再存入緩存;
beresp.do_gunzip:是否不壓縮就存入緩存
beresp.http.HEADER:
beresp.proto:
beresp.status:響應狀態碼
beresp.response:響應時的緣由短語
beresp.ttl:響應對象剩餘的生存時長,單位爲second;
beresp.backend.name: 此響應報文來源backend名稱;
beresp.backend.ip
beresp..backend.port
beresp.storage:將響應報文存儲在指定的存儲
(5)緩存對象存入cache以後可用的變量
obj.proto
obj.status:響應時的狀態碼
obj.response :響應是的緣由短語
obj.ttl
obj.hits:緩存對象命中的次數
obj.http.HEADER
(6)在決定對請求鍵作hash計算時可用的變量
req.hash:以指定查詢緩存的鍵作爲hash計算的鍵;
(7)在爲客戶端準備響應報文時可用的變量
resp.proto
resp.status
resp.response
resp.http.HEADER
5.4)補充:
vcl書寫的規則應用在varnish的狀態節點上。
vcl節點間彼此有相關性,可是彼此互相隔離
vcl狀態節點使用return(xxxx)來退出到varnish而非下一個狀態節點
varnish有一個默認vcl配置文件,若管理員在定義規則時將各個狀態節點規則寫明,則使用默認的
vcl配置文件中定義的節點規則實施
六 varnish的後端存儲
varnish支持多種不一樣類型的後端存儲,這能夠在varnishd啓動時使用-s選項指定。後端存儲的類型包括:
(1)file:使用特定的文件存儲所有的緩存數據,並經過操做系統的mmap()系統調用將整個緩存文件映射至內存區域(若是條件容許);
(2)malloc:使用malloc()庫調用在varnish啓動時向操做系統申請指定大小的內存空間以存儲緩存對象;
(3)persistent(experimental):與file的功能相同,但能夠持久存儲數據(即重啓varnish數據時不會被清除);仍處於測試期;
varnish沒法追蹤某緩存對象是否存入了緩存文件,從而也就無從得知磁盤上的緩存文件是否可用,所以,file存儲方法在varnish中止或重啓時 會清除數據。而persistent方法的出現對此有了一個彌補,但persistent仍處於測試階段,例如目前尚沒法有效處理要緩存對象整體大小超出 緩存空間的狀況,因此,其僅適用於有着巨大緩存空間的場景。
選擇使用合適的存儲方式有助於提高系統性,從經驗的角度來看,建議在內存空間足以存儲全部的緩存對象時使用malloc的方法,反之,file存儲將有着 更好的性能的表現。然而,須要注意的是,varnishd實際上使用的空間比使用-s選項指定的緩存空間更大,通常說來,其須要爲每一個緩存對象多使用差不 多1K左右的存儲空間,這意味着,對於100萬個緩存對象的場景來講,其使用的緩存空間將超出指定大小1G左右。另外,爲了保存數據結構 等,varnish自身也會佔去不小的內存空間。
下文的拓撲和IP設定
七 varnish的配置與安裝
*做者這裏登不上varnish的官方站點,故使用馬哥教育提供的自制varnish rpm包來演示
1 安裝:
[root@Test01 source]# rpm -ivh varnish-libs-3.0.6-1.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:varnish-libs ########################################### [100%]
[root@Test01 source]# rpm -ivh varnish-3.0.6-1.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:varnish ########################################### [100%]
2 生成的配置文件:
[root@Test01 source]# rpm -ql varnish
/etc/logrotate.d/varnish
/etc/rc.d/init.d/varnish #啓動腳本
/etc/rc.d/init.d/varnishlog
/etc/rc.d/init.d/varnishncsa
/etc/sysconfig/varnish #向varnish傳遞的參數
/etc/varnish
/etc/varnish/default.vcl #默認的vcl規則配置
/usr/bin/varnish_reload_vcl #varnish的管理工具
/usr/bin/varnishadm
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishreplay
/usr/bin/varnishsizes
/usr/bin/varnishstat
/usr/bin/varnishtest
/usr/bin/varnishtop
/usr/lib64/varnish
/usr/lib64/varnish/libvarnish.so
/usr/lib64/varnish/libvarnishcompat.so
/usr/lib64/varnish/libvcl.so
/usr/lib64/varnish/libvgz.so
/usr/lib64/varnish/vmods
/usr/lib64/varnish/vmods/libvmod_std.so
/usr/sbin/varnishd
/usr/share/doc/varnish-3.0.6 #生成的文檔
/usr/share/doc/varnish-3.0.6/ChangeLog
/usr/share/doc/varnish-3.0.6/LICENSE
/usr/share/doc/varnish-3.0.6/README
/usr/share/doc/varnish-3.0.6/README.redhat
/usr/share/doc/varnish-3.0.6/examples
/usr/share/doc/varnish-3.0.6/examples/default.vcl
/usr/share/doc/varnish-3.0.6/examples/zope-plone.vcl
/usr/share/man/man1/varnishadm.1.gz #生成的man手冊頁
/usr/share/man/man1/varnishd.1.gz
/usr/share/man/man1/varnishhist.1.gz
/usr/share/man/man1/varnishlog.1.gz
/usr/share/man/man1/varnishncsa.1.gz
/usr/share/man/man1/varnishreplay.1.gz
/usr/share/man/man1/varnishsizes.1.gz
/usr/share/man/man1/varnishstat.1.gz
/usr/share/man/man1/varnishtest.1.gz
/usr/share/man/man1/varnishtop.1.gz
/usr/share/man/man3/vmod_std.3.gz
/usr/share/man/man7/varnish-cli.7.gz
/usr/share/man/man7/varnish-counters.7.gz
/usr/share/man/man7/vcl.7.gz
/var/lib/varnish
/var/log/varnish #自身的日誌文件
[root@Test01 source]#
3 配置文件說明:
[root@Test01 source]#vim /etc/sysconfig/varnish
[root@Test01 source]# grep -E -v '(^#|^$)' /etc/sysconfig/varnish
NFILES=131072 --->打開的最大文件數,varnish自動調整該值
MEMLOCK=82000 --->內存中共享日誌空間的大小
NPROCS="unlimited" -->單個用戶運行的線程數
RELOAD_VCL=1 -->設置爲1 ,表示自動狀態vcl策略配置文件無需重啓varnish服務
VARNISH_VCL_CONF=/etc/varnish/default.vcl --->默認vcl策略文件的位置
VARNISH_LISTEN_PORT=80 --->varnish監聽的端口
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 --->varnish提供telnet管理端口監聽的地址
VARNISH_ADMIN_LISTEN_PORT=6082 --->varnish提供telnet管理端口監聽的端口VARNISH_SECRET_FILE=/etc/varnish /secret --->varnish爲管理端口提供的共享密鑰文件
VARNISH_MIN_THREADS=50 --->varnish啓動時啓動最少的線程數
VARNISH_MAX_THREADS=1000 --->varnish啓動時啓動最多的線程數VARNISH_THREAD_TIMEOUT=120 --->varnish線程數的空閒時間,超過該時間自動銷燬線程
VARNISH_STORAGE_MEM=100M -->使用內存爲存儲設備時使用的空間大小
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_MEM}"
--->當varnish後端存儲的配置,使用內存用來緩存數據,大小爲100M
VARNISH_TTL=120
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
-f ${VARNISH_VCL_CONF} \
-T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
-t ${VARNISH_TTL} \
-w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
-u varnish -g varnish \
-S ${VARNISH_SECRET_FILE} \
-s ${VARNISH_STORAGE}"
[root@Test01 source]#
[root@Test01 source]# service varnish start
Starting Varnish Cache: [ OK ]
[root@Test01 source]# ss -tlpn | grep 'varnish'
LISTEN 0 10 127.0.0.1:6082 *:* users:(("varnishd",2505,6))
LISTEN 0 128 :::80 :::* users:(("varnishd",2506,8))
LISTEN 0 128 *:80 *:* users:(("varnishd",2506,7))
[root@Test01 source]#
八 簡單的配置使用:
8.1)配置一個簡單的varnish實例:
(1):設定vcl規則配置文件:
[root@Test01 source]# cd /etc/varnish/
[root@Test01 varnish]# ls
default.vcl secret
[root@Test01 varnish]# cp default.vcl test.vcl
[root@Test01 varnish]# vim test.vcl
backend backwebserver {
.host = "172.16.100.6";
.port = "80";
}
sub vcl_recv {
set req.backend = backwebserver;
}
* 在這個配置中只是設定了後端的webserver的地址,在varnish的 vcl_recv狀態引擎上調用了一下
其它的vcl規則並沒設定,varnish默認從/etc/varnish/default.vcl中加載
(2):讓varnish加載該vcl規則文件:
[root@Test01 varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.32-504.el6.x86_64,x86_64,-smalloc,-smalloc,-hcritbit
varnish-3.0.6 revision 1899836
Type 'help' for command list.
Type 'quit' to close CLI session.
varnish> vcl.list
200
active 0 boot
varnish> vcl.load test1 test.vcl
200
VCL compiled.
varnish> vcl.use test1
200
(3)在客戶機上訪問下varnish監聽的地址,觀察包頭
8.2)配置varnish實例,顯示命中:
(1)上面的包頭中並無顯示是否命中,修改下vcl規則
[root@Test01 varnish]# vim test.vcl
backend backwebserver {
.host = "172.16.100.6";
.port = "80";
}
sub vcl_recv {
set req.backend = backwebserver;
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "Hit from"+" "+server.ip;
} else {
set resp.http.X-Cache = "Miss via"+" "+server.ip;
}
}
(2)加載新的vcl規則文件
[root@Test01 varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.32-504.el6.x86_64,x86_64,-smalloc,-smalloc,-hcritbit
varnish-3.0.6 revision 1899836
Type 'help' for command list.
Type 'quit' to close CLI session
varnish> vcl.load test2 test.vcl
200
VCL compiled.
varnish> vcl.use test2
200
(3)再此刷新瀏覽器,查看包頭信息
(6)在上圖中沒有命中,那麼咱們再次刷新瀏覽器觀察
8.3)配置varnish實例,讓bbs/路徑下文件的不緩存:
(1)後端主機上bss/index.html文件的設定:
[root@Test01 varnish]# !ssh
ssh 172.16.100.6
root@172.16.100.6's password:
Last login: Sun Jun 7 19:15:46 2015 from 172.16.100.1
[root@Test06 ~]# cd /var/www/html/bbs
[root@Test06 bbs]# ls
index.html
[root@Test06 bbs]# cat index.html
<h1>BBS 100.6</h1>
[root@Test06 bbs]# exit
logout
Connection to 172.16.100.6 closed.
[root@Test01 varnish]# curl http://172.16.100.6/bbs/index.html
<h1>BBS 100.6</h1>
[root@Test01 varnish]#
(2)修改vcl規則文件:
[root@Test01 varnish]# vim test.vcl
backend backwebserver {
.host = "172.16.100.6";
.port = "80";
}
sub vcl_recv {
if (req.url ~ "^/bbs/") {
return(pass);
}
set req.backend = backwebserver;
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "Hit from"+" "+server.ip;
} else {
set resp.http.X-Cache = "Miss via"+" "+server.ip;
}
}
(3)varnish從新加載vcl規則文件:
[root@Test01 varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.32-504.el6.x86_64,x86_64,-smalloc,-smalloc,-hcritbit
varnish-3.0.6 revision 1899836
Type 'help' for command list.
Type 'quit' to close CLI session
varnish> vcl.load test3 test.vcl
200
VCL compiled.
varnish> vcl.use test3
200
(4)客戶端瀏覽器中觀察:
九 配置varnish支持後端多臺服務器:
9.1)案例1:實現請求內容實現動靜分離
[root@Test01 varnish]# vim test.vcl
backend bkws1 {
.host= "172.16.100.6";
.port= "80";
}
backend bkws2 {
.host= "172.16.100.7";
.port = "80";
}
sub vcl_recv {
if (req.url ~ "\.php$") {
set req.backend = bkws1;
}
if (req.url~ "\.(html|css|js|jpg|jpeg|png|gif)$") {
set req.backend = bkws2;
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "Hitfrom"+" "+server.ip;
} else {
set resp.http.X-Cache = "Missvia"+" "+server.ip;
}
}
9.2)案例2,讓後臺支持個服務器
[root@Test01 varnish]# vim test.vcl
backend bkwb1{
.host = "172.16.100.6";
.port = "80";
}
backend bkwb2{
.host = "172.16.100.7";
.port = "80";
}
director webserver random {
{ .backend = bkwb1; .weight = 1; }
{ .backend = bkwb2; .weight = 1; }
}
sub vcl_recv {
set req.backend = webserver;
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "Hit from"+" "+server.ip;
} else {
set resp.http.X-Cache = "Miss via"+" "+server.ip;
}
}
十 配置對後端主機進行健康狀態檢測
[root@Test01 varnish]# vim test.vcl
7 probe bc {
8 .url = "/index.html";
9 .interval = 60s;
10 .timeout = 0.3s;
11 .window = 8;
12 .threshold = 3;
13 .initial = 3;
14 .expected_response = 200;
15 }
16 backend bkwb1{
17 .host = "172.16.100.6";
18 .port = "80";
19 .probe = bc;
20 }
21 backend bkwb2{
22 .host = "172.16.100.7";
23 .port = "80";
24 .probe = bc;
25 }
上面代碼中的7-15定義了後臺主機的健康檢查策略,在下面的2個後臺主機定義中分別被調用。
Varnish能夠檢測後端主機的健康狀態,在斷定後端主機失效時能自動將其從可用後端主機列表中移除,而一旦其從新變得可用還能夠自動將其設定爲可用。 爲了不誤判, Varnish在探測後端主機的健康狀態發生轉變時(好比某次探測時某後端主機忽然成爲不可用狀態),一般須要連續執行幾回探測均爲新狀態纔將其標記爲轉 換後的狀態。每一個後端服務器當前探測的健康狀態探測方法經過.probe進行設定。
.probe中的探測指令經常使用的有:
(1) .url:探測後端主機健康狀態時請求的URL,默認爲「/」;
(2) .request: 探測後端主機健康狀態時所請求內容的詳細格式,定義後,它會替換.url指定的探測方式;好比:
.request =
"GET /.healthtest.html HTTP/1.1"
"Host: www.magedu.com"
"Connection: close";
(3) .window:設定在斷定後端主機健康狀態時基於最近多少次的探測進行,默認是8;
(4) .threshold:在.window中指定的次數中,至少有多少次是成功的才斷定後端主機正健康運行;默認是3;
(5) .initial:Varnish啓動時對後端主機至少須要多少次的成功探測,默認同.threshold;
(6) .expected_response:指望後端主機響應的狀態碼,默認爲200;
(7) .interval:探測請求的發送週期,默認爲5秒;
(8) .timeout:每次探測請求的過時時長,默認爲2秒;
十一 清除單個緩存對象
[root@Test01 varnish]# vim test.vcl
7 backend bkws1 {
8 .host = "172.16.100.6";
9 .port = "80";
10 }
11 acl purgers {
12 "127.0.0.1";
13 "192.168.100.3"/24;
14 }
15 sub vcl_recv {
16 if (req.request == "PURGE") {
17 if (!client.ip ~ purgers) {
18 error 405 "Method not allowed";
19 }
20 return (lookup);
21 }
22 set req.backend = bkws1;
23 }
24 sub vcl_hit {
25 if (req.request == "PURGE") {
26 purge;
27 error 200 "Purged";
28 }
29 }
30
31 sub vcl_miss {
32 if (req.request == "PURGE") {
33 purge;
34 error 404 "Not in cache";
35 }
36 }
37
38 sub vcl_pass {
39 if (req.request == "PURGE") {
40 error 502 "PURGE on a passed object";
41 }
42 }
43
44 sub vcl_deliver {
45 if(obj.hits>0){
46 set resp.http.X-Cache = "Hit from"+" "+server.ip;
47 }else{
48 set resp.http.X-Cache = "Miss via"+" "+server.ip;
49 }
50 }
11~14行定義了一個容許進行修剪的地址列表;而後分別在vcl_revc vcl_hit vcl_miss vcl_pass中分別定義針對請求中包含有PURGE的怎樣進行清除緩存及應對代碼。
這是清除以前的:
下面是進行清除和使用瀏覽器進行驗證的: