varnish介紹

VCL
Varnish Configuration Language (VCL) 是一種動態語言,是varnish配置語言,用來描述請求處理和制定緩存策略。vcl配置內容由manager process 創建的VCC子進程轉換成C語言代碼,再經由gcc編譯成共享對象,最後裝載到cacher process中生效。
 
VCL文件被分爲多個子程序,不同的子程序在不同的時間裏執行,比如一個子程序在接到請求時執行,另一個子程序在接受到後端服務器傳送的文件時執行。
 
 
VCL處理流程圖

varnish介紹

處理過程大致分爲如下幾個步驟
1、Receive狀態:請求處理的入口狀態,根據VCL規則判斷該請求應該是Pass或Pipe或者進入Lookup(本地查詢)
 
2、Lookup狀態,在緩存中查找用戶請求的對象,如果緩存中沒有其請求的對象,後續操作很可能會將其請求的對象進行緩存;進入此狀態後,會在hash表中查找數據,若找到,則進入Hit(命中)狀態,否則進入miss狀態
 
3、Pass狀態,在此狀態下,會進入後端(源服務器)請求,即進入fetch狀態,不走緩存
 
4、Fetch狀態,在Fetch狀態下,對請求,進行後端的獲取,發送請求,獲得源服務器的數據,並進行本地的存儲
 
5、Deliver提供狀態,將獲取到的數據發送給客戶端,然後完成本次請求。
 
注:
Pass:繞過緩存,既不從緩存中查詢內容或不將內容存儲至緩存中;
 
Pipe:不對客戶端進行檢測或作出任何操作,而是在客戶端與後端服務器之間建立專用“管道”,並直接將數據在二者之間進行傳送;此時,keep-alive連接中後續傳送的數據都將通過此管道進行直接傳送,並不會出現在任何日誌中。
 
 
語法
  (1)支持註釋  // # /* */
  (2)不支持循環
  (3)sub $name:用於定義子例程
        sub vcl_recv {

        }
  (4)有衆多內置的變量,變量的可調用位置與state engine有密切相關性
  (5)支持終止語句,return(action),沒有返回值
  (6)"域"專用
  (7)操作符 =,==,!,&&,||
 
 
常用語句
 
  if     else
  set name=value  
  unset name
  req.http.HEADER:調用請求報文中http協議的指定的變量
  req.request:請求方法
 
varnish變量種類
req——請求
resp——響應
client——客戶端
server——服務端
bereq——向後端請求時產生的req
beresp——後端響應時產生的resp
obj——項目對象
storage——大小
 
常用變量:
bereq和req:
bereq(req).http.HEADERS: 由varnish發往backend server的請求報文的指定首部;
bereq(req).request:請求方法;
bereq(req).url:   請求路徑
bereq(req).proto: 請求協議
bereq(req).backend:指明要調用的後端主機;
 
beresp和resp
                beresp.proto:響應使用的協議
                beresp.status:響應的狀態碼
                beresp.reason:原因短語;
                beresp.backend.ip:響應的後端ip地址
                beresp.backend.name:響應的後端域名
                beresp.http.HEADER: 從backend server響應的報文的首部;
                beresp.ttl:後端服務器響應的內容的餘下的生存時
 
obj
                obj.ttl: 對象的ttl值;
                obj.hits:此對象從緩存中命中的次數;
 
server
                server.ip
                server.hostname
 
 
CDN
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章