Varnish Configuration Language - VCL(varnish配置語(yǔ)言-VCL)
2016年03月11日 14:59:42?s1234567_89?閱讀數(shù):285更多
個(gè)人分類:?varnish
http://linuxguest.blog.51cto.com/195664/355220
Varnish Configuration Language - VCL(varnish配置語(yǔ)言-VCL)
?????????Varnish有一個(gè)很棒的配置系統(tǒng),大部分其他的系統(tǒng)使用配置指令,讓您打開或者關(guān)閉一些開關(guān)。Varnish使用區(qū)域配置語(yǔ)言,這種語(yǔ)言叫做“VCL”(varnish configuration language),在執(zhí)行vcl時(shí),varnish就把VCL轉(zhuǎn)換成二進(jìn)制代碼。
?????????VCL文件被分為多個(gè)子程序,不同的子程序在不同的時(shí)間里執(zhí)行,比如一個(gè)子程序在接到請(qǐng)求時(shí)執(zhí)行,另一個(gè)子程序在接收到后端服務(wù)器傳送的文件時(shí)執(zhí)行。????
varnish將在不同階段執(zhí)行它的子程序代碼,因?yàn)樗拇a是一行一行執(zhí)行的,不存在優(yōu)先級(jí)問題。隨時(shí)可以調(diào)用這個(gè)子程序中的功能并且當(dāng)他執(zhí)行完成后就退出。
???????如果到最后您也沒有調(diào)用您的子進(jìn)程中的功能,varnish將執(zhí)行一些內(nèi)建的VCL代碼,這些代碼就是default.vcl中被注釋的代碼。
???????99%的幾率您需要改變vcl_recv?和?vcl_fetch這兩個(gè)子進(jìn)程。
???????vcl_recv
??????????????vcl_recv(當(dāng)然,我們?cè)谧址嫌悬c(diǎn)不足,應(yīng)為它是unix)在請(qǐng)求的開始被調(diào)用,在接收、解析后,決定是否響應(yīng)請(qǐng)求,怎么響應(yīng),使用哪個(gè)后臺(tái)服務(wù)器。
??????????????在vcl_recv中,您可以修改請(qǐng)求,比如您可以修改cookies,添加或者刪除請(qǐng)求的頭信息。
??????????????注意vcl_recv中只有請(qǐng)求的目標(biāo),req is available。
vcl_fetch
???????vcl_fetch在一個(gè)文件成功從后臺(tái)獲取后被調(diào)用,他的任務(wù)就是改變響應(yīng)的頭文件,觸發(fā)ESI進(jìn)程,在后臺(tái)服務(wù)器輪詢嘗試失敗的請(qǐng)求。
??????????????在vcl_fetch中一樣的包含請(qǐng)求的目標(biāo),req,available,哪里通常是backend response,beresp.beresp將會(huì)包含后端服務(wù)器的HTTP的頭信息
???????actions
???????主要有以下動(dòng)作
??????????????pass??????????????\\當(dāng)一個(gè)請(qǐng)求被pass后,這個(gè)請(qǐng)求將通過varnish轉(zhuǎn)發(fā)到后端服務(wù)器,但是它不會(huì)被緩存。pass可以放在vcl_recv?和?vcl_fetch中。
??????????????lookup???????????\\當(dāng)一個(gè)請(qǐng)求在vcl_recv中被lookup后,varnish將從緩存中提取數(shù)據(jù),如果緩存中沒有數(shù)據(jù),將被設(shè)置為pass,不能在vcl_fetch中設(shè)置lookup。
??????????????pipe\\pipe和pass相似,都要訪問后端服務(wù)器,不過當(dāng)進(jìn)入pipe模式后,在此連接未關(guān)閉前,后續(xù)的所有請(qǐng)求都發(fā)到后端服務(wù)器(這句是我自己理解后簡(jiǎn)化的,有能力的朋友可以看看官方文檔,給我提修改建議)。
??????????????deliver???????????\\請(qǐng)求的目標(biāo)被緩存,然后發(fā)送給客戶端
??????????????esi\\ESI-process?the fetched document(我理解的就是vcl中包換一段html代碼)
?Requests,Responses and objects
??????????????在VCL中,有3個(gè)重要的數(shù)據(jù)結(jié)構(gòu)
??????????????request?從客戶端進(jìn)來
????????responses?從后端服務(wù)器過來
??????????????object?存儲(chǔ)在cache中
??????????????在VCL中,你需要知道以下結(jié)構(gòu)
??????????????req?????????\\請(qǐng)求目標(biāo),當(dāng)varnish接收到一個(gè)請(qǐng)求,這時(shí)req object就被創(chuàng)建了,你在vcl_recv中的大部分工作,都是在req object上展開的。
??????????????beresp??????????\\后端服務(wù)器返回的目標(biāo),它包含返回的頭信息,你在vcl_fetch中的大部分工作都是在beresp object上開展的。
??????????????obj?????????\\被cache的目標(biāo),只讀的目標(biāo)被保存于內(nèi)存中,obj.ttl的值可修改,其他的只能讀。
Operaors
??????????????VCL支持一下運(yùn)算符,請(qǐng)閱讀下面的例子:
??????????????=???????????????????\\賦值運(yùn)算符
??????????????==?????????????????\\對(duì)比
??????????????~???????????????????\\匹配,在ACL中和正則表達(dá)式中都可以用
??????????????!??????????????????\\否定
??????????????&&?????????????????\\邏輯與
??????????????||???????????????????\\邏輯或
???????EXAMPLE 1 – manipulation headers
??????????????我們想要取消我們服務(wù)器上/images目錄下的所有緩存:
sub vcl_recv {
if (req.url ~ "^/images") {
unset req.http.cookie;
}
}
EXAMPLE 2 – manipulation beresp
??????????????從后端服務(wù)器返回對(duì)象的值滿足一些標(biāo)準(zhǔn),我們就修改它的TTL值:
sub vcl_fetch {
???if (beresp.url ~ "\.(png|gif|jpg)$") {
?????unset beresp.http.set-cookie;
?????beresp.ttl = 3600;
??}
}
EXAMPLE3-ACLs
??????????????你創(chuàng)建一個(gè)VCL關(guān)鍵字的訪問控制列表。你可以配置客戶端的IP地址
??????????????# Who is allowed to purge....
??????????????acl local {
??????????????????"localhost";
??????????????????"192.168.1.0"/24; /* and everyone on the local network */
??????????????????! "192.168.1.23"; /* except for the dialin router */
??????????????}
sub vcl_recv {
????????????????if (req.request == "PURGE") {
??????????????????if (client.ip ~ local) {
?????????????????????return(lookup);
??????????????????}
????????????????}
??????????????}
sub vcl_hit {
?????????????????if (req.request == "PURGE") {
???????????????????set obj.ttl = 0s;
???????????????????error 200 "Purged.";
??????????????????}
??????????????}
??????????????sub vcl_miss {
????????????????if (req.request == "PURGE") {
??????????????????error 404 "Not in cache.";
????????????????}
??????????????}