Varnish工作原理及配置_第1頁
Varnish工作原理及配置_第2頁
Varnish工作原理及配置_第3頁
Varnish工作原理及配置_第4頁
Varnish工作原理及配置_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Varnish工作原理及配置網址:bbb:/ixdba.blog.51ctoaaa/2895551/6825551、VCL使用說明VCL,即為Varnish Configuation Language,用來定義varnish的存取策略,VCL語法比較簡單,跟C和perl比較相似,可以使用指定運算符“=”,比較運算符“=”,邏輯運算符“!,&&,!”等形式。還支持正則表達樣和用“”進行ACL匹配運算,同時還可以使用“set”這樣的關鍵字來指定變量。需要注意的是,“”字符在VCL里沒有特別的含義,這點與其它語言略有不同,另外,VCL只是配置,并不是真正的編程語言,沒有循環(huán),也沒有自

2、定義變量。 在講述Varnish配置之前,首先需要了解下varnish的配置語法,即VCL,下面對VCL常用的一些內置函數和公用變量進行詳細介紹。VCL內置函數(1)vcl_recv函數用于接收和處理請求,當請求到達并成功接收后被調用,通過判斷請求的數據來決定如何處理請求。此函數一般以如下幾個關鍵字結束:q pass:表示進入pass模式,把請求控制權交給vcl_pass函數。q pipe:表示進入pipe模式,把請求控制權交給vcl_pipe函數。q error code reason:表示返回“code”給客戶端,并放棄處理該請求,“code”是錯誤

3、標識,例如200、405等,“reason”是錯誤提示信息。(2)vcl_pipe函數此函數在進入pipe模式時被調用,用于將請求直接傳遞至后端主機,在請求和返回的內容沒有改變的情況下,將不變的內容返回給客戶端,直到這個鏈接關閉。此函數一般以如下幾個關鍵字結束:q error code reason q pipe(3)vcl_pass函數此函數在進入pass模式時被調用,用于將請求直接傳遞至后端主機,后端主機應答數據后送給客戶端,但不進行任何緩存,在當前連接下每次都返回最新的內容。此函數一般以如下幾個關鍵字結束:q error code reason&#

4、160;q pass(4)lookup表示在緩存里查找被請求的對象,并且根據查找的結果把控制權交給函數vcl_hit或者函數vcl_miss。(5)vcl_hit函數在執(zhí)行l(wèi)ookup指令后,如果在緩存中找到請求的內容,將自動調用該函數。此函數一般以如下幾個關鍵字結束:q deliver:表示將找到的內容發(fā)送給客戶端,并把控制權交給函數vcl_deliver。q error code reason q pass(6)vcl_miss函數在執(zhí)行l(wèi)ookup指令后,如果沒有在緩存中找到請求的內容時自動調用該方法,此函數可以用于判斷是否需要從后端服務

5、器取內容。此函數一般以如下幾個關鍵字結束:q fetch:表示從后端獲取請求的內容,并把控制權交給vcl_fetch函數。q error code reason q pass(7)vcl_fetch函數在從后端主機更新緩存并且獲取內容后調用該方法,接著,通過判斷獲取的內容來決定是否將內容放入緩存,還是直接返回給客戶端。此函數一般以如下幾個關鍵字結束:q error code reasonq passq deliver(8)vcl_deliver函數在緩存中找到請求的內容后,發(fā)送給客戶端前調用此方法。此函數一般以如下幾個關鍵字

6、結束:q error code reason q deliver(9)vcl_timeout 函數此函數在緩存內容到期前調用。一般以如下幾個關鍵字結束:q discard:表示從緩存中清除該內容。q fetch(10)vcl_discard函數在緩存內容到期后或緩存空間不夠時,自動調用該方法,一般以如下幾個關鍵字結束:q keep:表示將內容繼續(xù)保留在緩存中。q discard 2、VCL處理流程圖 通過上面對VCL函數的介紹,讀者對各個函數實現的功能已經有了一個了解,其實每個函數之間都是相互關聯的,下圖

7、列出了varnish處理bbb請求的一個運行流程圖。處理過程大致分為如下幾個步驟:(1) Receive狀態(tài),也就是請求處理的入口狀態(tài),根據VCL規(guī)則判斷該請求應該是Pass或Pipe,或者進入Lookup(本地查詢)。(2) Lookup狀態(tài),進入此狀態(tài)后,會在hash表中查找數據,若找到,則進入Hit狀態(tài),否則進入miss狀態(tài)。(3) Pass狀態(tài),在此狀態(tài)下,會進入后端請求,即進入fetch狀態(tài)。 (4) Fetch狀態(tài),在Fetch狀態(tài)下,對請求進行后端的獲取,發(fā)送請求,獲得數據,并進行本地的存儲。(5) Deliver狀態(tài),

8、 將獲取到的數據發(fā)送給客戶端,然后完成本次請求。3、內置公用變量 VCL內置的公用變量可以用在不同的VCL函數中,根據這些公用變量使用的不同階段,下面依次介紹。當請求到達后,可以使用的公用變量如表2所示:表2公用變量名稱    含義req.backend        指定對應的后端主機server.ip              表示服務器端IPclien

9、t.ip               表示客戶端IPreq.request          指定請求的類型,例如GET、HEAD、POST等req.url                 指定請求的位置req

10、.proto            表示客戶端發(fā)起請求的bbb協議版本req.bbb.header   表示對應請求中的bbb頭部信息req. restarts         表示請求重啟的次數,默認最大值為4Varnish             

11、;  在向后端主機請求時,可以使用的公用變量如表3所示:表3公用變量名稱 含義beresp.request 指定請求的類型,例如GET、HEAD等beresp.url 指定請求的位置beresp .proto 表示客戶端發(fā)起請求的bbb協議版本beresp .bbb.header 表示對應請求中的bbb頭部信息beresp .ttl 表示緩存的生存周期,也就是cache保留多長時間,單位是秒從cache或者后端主機獲取內容后,可以使用的公用變量如表4所示:表4公用變量名稱 含義obj.status 表示返

12、回內容的請求狀態(tài)代碼,例如200、302、504等obj.cacheable 表示返回的內容是否可以緩存,也就是說,如果bbb返回是200、203、300、301、302、404、410等,并且有非0的生存期,則可以緩存obj.valid 表示是否是有效的bbb應答obj.response 表示返回內容的請求狀態(tài)信息to 表示返回內容的bbb協議版本obj.ttl 表示返回內容的生存周期,也就是緩存時間,單位是秒obj.lastuse 表示返回上一次請求到現在的間隔時間,單位是秒對客戶端應答時,可以使用的公用變量如表5所

13、示:表5公用變量名稱 含義resp.status 表示返回給客戶端的bbb狀態(tài)代碼to 表示返回給客戶端的bbb協議版本resp.bbb.header 表示返回給客戶端的bbb頭部信息resp.response 表示返回給客戶端的bbb狀態(tài)信息在上面的講述中,我們只是介紹了常用的VCL內置公用變量,如果需要了解和使用更多的公用變量信息,請登錄varnish官方網站查閱。三 、配置一個簡單的Varnish實例 由于版本的不同,Varnish配置文件的寫法也存在一定差異,varnish2.x版本和1.x版本之間不但配置文件

14、寫法不同,而且新的版本功能也增加很多,并且去除了很多應用BUG,這里講述的版本是varnish2.1.2,配置文件寫法也以varnish2.x版本為基準。Varnish安裝完成后,默認的配置文件為/usr/local/varnish/etc/varnish/default.vcl,此文件內容默認全部被注釋掉了,這里,我們以這個文件為模板,創(chuàng)建一個新的文件vcl.conf,并且放到/usr/local/varnish/etc目錄下,配置完成的vcl.conf文件如下:#通過backend定義了一個名稱為webserver的后端主機,“.host”指定后端主機的IP位置或者域名,“.port”指定

15、后端主機的服務端口。其中,“6”就是后端的一個web服務器。backend webserver      .host = "6"     .port = "80" #調用vcl_recv開始。sub vcl_recv         if (req.bbb.x-forwarded-for)      

16、           set req.bbb.X-Forwarded-For =                    req.bbb.X-Forwarded-For ", " client.ip;        els

17、e                 set req.bbb.X-Forwarded-For = client.ip;        #如果請求的類型不是GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE時,進入pipe模式。注意這里是“&&”的關系。        i

18、f (req.request != "GET" &&           req.request != "HEAD" &&           req.request != "PUT" &&        

19、60;  req.request != "POST" &&           req.request != "TRACE" &&           req.request != "OPTIONS" &&      &#

20、160;    req.request != "DELETE")            return (pipe);        #如果請求的類型不是GET與HEAD,則進入pass模式。   if (req.request != "GET" && req.request != "HEAD") 

21、60;          return (pass);        #對或者ixdbabbb兩個域名進行緩存加速,這是個泛域名的概念,也就是所有以或者ixdbabbb結尾的域名都進行緩存。        if (req.bbb.host "(.*)" | req.bbb.host "(.*).ixdbabbb")  

22、          set req.backend = webserver;        #對以.jsp和.do結尾以及帶有?的URL時,直接從后端服務器讀取內容。        if (req.url ".(jsp|do)($|?)")          

23、  return (pass);        else         return (lookup);         sub vcl_pipe     return (pipe); sub vcl_pass     return (pass); sub vcl_hash  

24、   set req.hash += req.url;    if (req.bbb.host)         set req.hash += req.bbb.host;    else         set req.hash += server.ip;        return (hash); sub

25、 vcl_hit     if (!obj.cacheable)         return (pass);        return (deliver); sub vcl_miss     return (fetch); sub vcl_fetch      if (!beresp.cacheable)    &

26、#160;     return (pass);          if (beresp.bbb.Set-Cookie)          return (pass);     #當url中包含servlet時,不進行緩存。    if (req.url "/servlet/")   &#

27、160;     return (pass);    #當url中包含services時,不進行緩存。    if (req.url "/services/")         return (pass);    #對于請求類型是GET,并且請求的URL中包含upload,那么就進行緩存,緩存的時間是300秒,即5分鐘。    if (req.re

28、quest = "GET" && req.url "/upload(.*)$")        set beresp.ttl = 300s;    #對于請求類型是GET,并且請求的URL以png、xsl、xml、gif、css、js等結尾時,則進行緩存,緩存時間為600秒。    if (req.request = "GET" && req.url ".(png|xsl|x

29、ml|pdf|ppt|doc|docx|chm|rar|zip|bmp|jpeg|swf|ico|mp3|mp4|rmvb|ogg|mov|avi|wmv|swf|txt|png|gif|jpg|css|js|html|htm)$")        set beresp.ttl = 600s;        return (deliver);  #下面是添加一個Header標識,以判斷緩存是否命中。sub vcl_deliver  &#

30、160;  if (obj.hits > 0)        set resp.bbb.X-Cache = "HIT from "    else       set resp.bbb.X-Cache = "MISS from "        return (deliver);本文出自 “技術成就夢想” 博客,謝絕轉載!

31、網址:bbb:/wangnowaaa/article/17-varnish-makes-websites-flyVarnish安裝配置和使用2011-05-05 Web開發(fā) 標簽: 緩存 varnish先引用Varnish官方網站宣傳語:Varnish makes websites fly! (讓網站飛?)Varnish定義為一種網站加速的軟件(其實就是反向代理),可以把整個網頁內容緩存到內存(或文件)中,并設置不同類型的頁面緩存不同時間(TTL),同時提供緩存的更新(purge)。此外還可以設置多個后端服務器,支持后端服務器的健康檢查,Header甚至url位置

32、的重置修改,以及ESI(Edge Side Includes)功能(與nginx的ssi類似)先介紹一下Varnish處理請求的主要處理方法和流程1 vcl_recv,首先接收請求,判斷是否要進一步處理,還是直接轉發(fā)給后端(pass)等。 此過程中可以使用和請求相關的變量,例如客戶端請求的url,ip,user-agent,cookie等,此過程中可以把不需緩存的位置,通過判斷(相等、不相等、正則匹配等方法)轉給后端,例如gif/png/jpg/css/js等靜態(tài)文件;2 vcl_fetch,當從后端服務器獲取內容后會進入此階段,除了可以使用客戶端的請求變量,還可以使用從后端獲取的信息(ber

33、sp),如后端返回的頭信息,設置此信息的緩存時間TTL等;3 vcl_miss 緩存未命中時中要做的處理4 vcl_hit 緩存命中后做的處理5 vcl_delever 發(fā)送給客戶端前的處理6 vcl_pass 交給后端服務器7 vcl_hash 設置緩存的鍵值key首次請求時過程如下:recv->hash->miss->fetch->deliver緩存后再次請求:recv->hash->hit->deliver(fetch的過程沒了,這就是我們要做的,把要緩存的頁面保存下來)直接交給后端pass的情況:recv->hash->pass-&

34、gt;fetch->deliver(直接從后端獲取數據后發(fā)送給客戶端,此時Varnish相當于一個中轉站,只負責轉發(fā))*詳細請求過程可以參考./bin/varnishlog中的輸出日志下面具體介紹安裝和配置一、安裝1 下載源文件bbb://releases,或者選擇相應的編譯版本直接安裝(如直接安裝方式以下步驟可跳過)$ tar zxf varnish-2.1.5.tar.gz$ cd varnish-2.1.5/#假設安裝在/data/app/varnish下,詳細安裝設置查看幫助./configure -help$ ./configure -p

35、refix=/data/app/varnish$ make$ make install注意,如果配置中提示一個或者其中幾個警告信息的話,是沒有安裝對應的支持庫configure: WARNING: xsltproc not found not building documentationchecking for rst2man. nochecking for rst2man.py. noconfigure: WARNING: rst2man not found not building man pageschecking for clock_gettime in -lrt. yeschecki

36、ng for dlopen in -ldl. yeschecking for library containing initscr. noconfigure: WARNING: curses not found; some tools will not be built直接安裝對應擴展庫即可,否則varnishhist varnishtop varnishsizes varnishstat這些工具不會安裝sudo apt-get install xsltproc rst2man libncurses5-dev二、配置首先,修改Varnish的配置文件default.vcl,默認在安裝目錄的./

37、etc/varnish/下,當然,在哪并不重要,可以在啟動服務的時候指定配置文件(關鍵你要記得位置)#開頭的是注釋標記,.host表示的是后端服務器的位置或者域名,.port其對應的端口號(這里為了方便測試,Varnish和web服務器都位于一臺機子上,我們用Varnish監(jiān)聽8080端口,暫時先不修改原web服務器的80端口)backend default .host = "" .port = "80"好了,可以運行Varnish了,sudo ./sbin/varnishd -f /data/app/varnish/etc/varni

38、sh/default.vcl -s malloc,32M -T :2000 -a :8080 -F直接訪問localhost:8080即可看到經過Varnish輸出的頁面了!怎么樣,很簡單吧。通過Firebug或者curl -I查看bbb頭信息:Server: nginxContent-Type: text/htmlLast-Modified: Sat, 09 Apr 2011 15:51:38 GMTContent-Encoding: gzipContent-Length: 134Date: Thu, 05 May 2011 14:15:59 GMTX-Var

39、nish: 1047954835 1047954830Age: 7Via: 1.1 varnishConnection: keep-alive可以看到多了三項X-Varnish、Age、Via如何判斷是否是經過緩存的呢?首先可以看Age字段,如果是大于0的話,說明是從緩存命中的。其次查看X-Varnish字段,如果是兩個數字例如X-Varnish: 1668515406 1668515405代表的是Varnish兩次請求id(req.xid):一個為發(fā)起請求的id,另外一個是獲取緩存的id,而緩存未命中或者pass到后端的情況都是一個數值(當然你可以在deliver過程中修改這些頭信息或者直接

40、隱藏掉)注意!如果后端程序設置了類似這樣的頭信息Cache-Control: max-age=300會重置默認的緩存時間TTL,當然你可以在配置文件中重置這個時間下面看具體的配置文件,具體作用看注釋#設置后端服務器位置backend default .host = "" .port = "80"#允許刷新緩存的ipacl purgeAllow "localhost" ""sub vcl_recv #刷新緩存設置 if (req.request = "PURGE&q

41、uot;) #判斷是否允許ip if (!client.ip purgeAllow) error 405 "Not allowed." #去緩存中查找 return (lookup); #首次訪問增加X-Forwarded-For頭信息,方便后端程序 #獲取客戶端ip if (req.restarts = 0) #如果設置過此header則要再次附加上,用,隔開,如果 #只有一層代理的話,就無需設置了 if (req.bbb.x-forwarded-for) set req.bbb.X-Forwarded-For = req.bbb.X-Forwarded-For &quo

42、t;, " client.ip; #沒有則要加上 else set req.bbb.X-Forwarded-For = client.ip; #修正客戶端的Accept-Encoding頭信息,默認選用gzip方式 #防止個別瀏覽器發(fā)送類似 deflate, gzip #當然后端如果只支持gzip的話.可以只設置gizp if (req.bbb.Accept-Encoding) if (req.bbb.Accept-Encoding "gzip") set req.bbb.Accept-Encoding = "gzip" #如果后端支持defl

43、ate方式,建議去掉,否則刷新緩存時 #需特殊處理 elsif (req.bbb.Accept-Encoding "deflate") set req.bbb.Accept-Encoding = "deflate" #其他的壓縮方式忽略 else remove req.bbb.Accept-Encoding; #靜態(tài)文件和明確以.php結尾的url無需緩存, 建議把靜態(tài)文件分離 #至單獨服務器下,減少動態(tài)應用服務器壓力,同時降低arnishd的壓力 if(req.url ".(png|gif|jpg|css|js|php)$") re

44、turn (pass); #非正規(guī)的請求直接轉發(fā)給后端服務器 if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.r

45、equest != "DELETE") /* Non-RFC2616 or CONNECT which is weird. */ return (pipe); #只處理GET和HEAD請求,如果你不想緩存POST的頁面話 if (req.request != "GET" && req.request != "HEAD") return (pass); #bbb認證的頁面也pass if (req.bbb.Authorization) return (pass); return (lookup);#管道?按官方文檔說的是

46、此模式下請求會原封不動的轉交給后端知道連接關閉sub vcl_pipe return (pipe);#交給后端服務器sub vcl_pass return (pass);#緩存文件名的哈希處理sub vcl_hash #以url為hash set req.hash += req.url; #加上host if (req.bbb.host) set req.hash += req.bbb.host; #沒有則取ip else set req.hash += server.ip; #支持壓縮的要增加,防止發(fā)送給不支持壓縮的瀏覽器壓縮的內容 if(req.bbb.Accept-Encoding) s

47、et req.hash += req.bbb.Accept-Encoding; return (hash);#緩存命中后的處理sub vcl_hit #如果不可緩存,直接交給后端 if (!obj.cacheable) return (pass); #如果為更新緩存的請求,則設置ttl為0,并告知客戶端處理結果 if (req.request = "PURGE") set obj.ttl = 0s; error 200 "Purged." return (deliver);#緩存未命中sub vcl_miss #更新緩存的請求,提示緩存不存在Not in

48、 cache if (req.request = "PURGE") error 404 "Not in cache." #既然緩存不存在了,就去后端取吧 return (fetch);# sub vcl_fetch #是否開啟ESI功能(僅做演示用,單獨給/esi-test.html開啟esi) if (req.url = "/esi-test.html") esi; #如果后端返回不可緩存,直接pass if (!beresp.cacheable) return (pass); #/article/下的url緩存30分鐘(演示用)

49、if (req.url "/article/d+.html$") set beresp.ttl = 30m; #/category/下的url緩存20分鐘(演示用) if (req.url "/category/$") set beresp.ttl = 20m; #如果后端發(fā)送了set-cookie頭信息(如session會話開啟),則不緩存 if (beresp.bbb.Set-Cookie) return (pass); return (deliver);#發(fā)送給客戶端sub vcl_deliver #去掉varnish中的一些頭信息(如果你不想保留

50、的話,建議保留Age,方便查看) #remove resp.bbb.X-Varnish; #remove resp.bbb.Via; return (deliver);#定義錯誤頁面的信息sub vcl_error #設置返回頁面的類型及編碼 set obj.bbb.Content-Type = "text/html; charset=utf-8" #具體內容,可以更加自己的需要修改錯誤提示信息 synthetic " <?xml version="1.0" encoding="utf-8"?> <!DOC

51、TYPE html PUBLIC "-/W3C/DTD XHTML 1.0 Strict/EN" "bbb://TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>" obj.status " " obj.response "</title> </head> <body> <h1>Error " obj.status " "

52、; obj.response "</h1> <p>" obj.response "</p> <h3>Guru Meditation:</h3> <p>XID: " req.xid "</p> <pre> "req.bbb.Host" </pre> <hr> <p>Varnish cache server</p> </body> </html> " r

53、eturn (deliver);最后簡單總結下Varnish優(yōu)點不同的頁面設置不同的緩存時間,緩存更新快捷缺點緩存不能持久保存,服務重啟后緩存消失不支持bbbs,本身不提供gzip輸出(只是把后端服務器返回的壓縮信息保存下來)Transfer-Encoding方式中的chunked消失了,替代的是Content-Length,看來Varnish是獲取后端的數據后自己計算出了body長度要考慮的問題后端動態(tài)應用的相應修改,例如對IP的獲取,要通過bbb頭信息中的x-forwarded-for獲得,另外對cookie的讀取不能直接在代碼中調用,例如登錄信息的讀取可以改為js方式,防止頁面緩存用戶私

54、有的信息(如用戶的個人中心)直接pass給后端的請求會有一定的開銷(代理服務器都有這個問題,前提是這個開銷要小于緩存后的開銷,否則還不如直接訪問后端)不提供gzip等格式的壓縮,而是從后端獲取時更加Accept-Encoding來獲取(即完全模擬瀏覽器的行為),所以很容易造成兩種或多種格式的緩存文件,給緩存的更新帶來麻煩其他注意事項啟動varnishd的時候如果選用-s file方式,每次會重新建立緩存文件,而原來的文件不會刪除,因此注意清除這些遺留文件緩存的默認保存時間(time-to-live準確說應該是緩存的存活時間)default_ttl默認為120秒,當然你可以在啟動varnish的時候指定為121秒,如:-t 121啟動varnishd時注意-w min,max,timeout,分別代表thread_pool_min、thread_pool_max、thread_pool_timeout,根據實際需求調節(jié),當然你可以通過varnishadm隨時調節(jié)寫ACL配置文件時要注意,例如acl purgeAllow "localhost

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論