Varnish Configuration Language - VCL(varnish配置語(yǔ)言-VCL)

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.";

????????????????}

??????????????}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 緩存的基礎(chǔ)知識(shí) 1、程序本身具有局部性 時(shí)間局部性過去訪問到的數(shù)據(jù),也有可能被兩次訪問 空間局部性一個(gè)數(shù)據(jù)被訪問到...
    魏鎮(zhèn)坪閱讀 2,233評(píng)論 1 3
  • 1.介紹 運(yùn)維日常: 2.Web Page Cache: varnish2.0,3.0處理過程 varnish4....
    尛尛大尹閱讀 3,471評(píng)論 0 0
  • 本文編譯自:users-guide 本節(jié)講述如何使用 VCL 編寫處理 HTTP 流量的策略。 Varnish 的...
    C86guli閱讀 3,306評(píng)論 0 1
  • 北風(fēng)呼呼 寒夜長(zhǎng)長(zhǎng) 一堆篝火與我相伴 帳外還是漆黑一爿 漫漫夜已沉睡 慢慢我亦沉睡 薪火接力 永遠(yuǎn)散發(fā)著...
    潤(rùn)澤雜夥閱讀 383評(píng)論 0 6
  • 為什么會(huì)淚流滿面呢!因?yàn)槲揖o張得不得了啊!蒼天啊!離得這么近!她會(huì)不會(huì)嫌棄我啊!會(huì)不會(huì)煩我啊! 都說沒有印象比差印...
    水居于淵閱讀 130評(píng)論 0 0

友情鏈接更多精彩內(nèi)容