天天看點

varnish 使用進階

varnish 使用進階

================================================================================

概述:

 1.state engine:狀态引擎切換機制(varnish4.0 )

★request:  vcl_recv   接受請求封包 ★response:  vcl_deliver 發送請求封包 ★處理流程: ①緩存命中 vcl_hash -(hit)-> vcl_hit --> vcl_deliver ②緩存未命中 vcl_hash -(miss)-> vcl_miss --> vcl_backend_fetch --> vcl_backend_response --> vcl_deliver  ③緩存修減(處理,清理) vcl_hash -(purge)-> vcl_purge --> vcl_synth  ④請求不能識别,直接響應到後端,建立一個管道 vcl_hash -(pipe)-> vcl_pipe ★兩個特殊的引擎: vcl_init:在處理任何請求之前要執行的vcl代碼:主要用于初始化VMODs; vcl_fini:所有的請求都已經結束,在vcl配置被丢棄時調用;主要用于清理VMODs;

 2.vcl的文法格式:

★文法格式 VCL files start with vcl 4.0;             指明版本 //, # and /* foo */ for comments;  單行和多行注釋 Subroutines are declared with the sub keyword;   子例程要用sub關鍵字聲明 例如:sub vcl_recv { ...}; No loops, state-limited variables  不支援循環,受限于引擎的内建變量; Terminating statements with a keyword for next action as argument of the return() function, i.e.: return(action); Domain-specific:域專用的配置 ★The VCL Finite State Machine vcl  有限狀态機 Each request is processed separately; Each request is independent from others at any given time; States are related, but isolated; return(action); exits one state and instructs Varnish to proceed to the next state; Built-in VCL code is always present and appended below your own VCL; ★三類主要文法:
varnish 使用進階

示例:

-------------------------------------------------------------------------------

 3.VCL Built-in Functions and Keywords 內建函數和關鍵字

★函數: regsub(str, regex, sub)      正規表達式替換 regsuball(str, regex, sub)   替換所有 ban(boolean expression)      清理緩存項 hash_data(input)             對指定的資料做哈希計算 synthetic(str)
varnish 使用進階
★Keywords: call subroutine    調用子例程關鍵字 return(action)     return關鍵字,指明下一次的action new set                  設定一個變量值 unset              撤銷一個變量值 ★操作符: ==, !=, ~, >, >=, <, <= 邏輯操作符:&&, ||, ! 變量指派:=

示範:

  通過判斷響應封包緩存命中的次數來判斷是否命中緩存

 1)因為是響應封包,是以在val_deliver中定義,是以編輯/etc/varnish/default.vcl如下:

varnish 使用進階

 2)讓配置生效需要執行varnish_reload_vcl也可手動執行,如下:

 3)在浏覽器中檢視,可以發現在http首部添加的首部X-Cache 為HIT,說明為緩存命中的,如下:

varnish 使用進階

 1.内建變量和使用者自定義變量:

★內建變量 ☉req.*:request,表示由用戶端發來的請求封包相關; req.http.*    req.http.User-Agent, req.http.Referer, ... ☉bereq.*:由varnish發往BE主機的httpd請求相關; bereq.http.* ☉beresp.*:由BE主機響應給varnish的響應封包相關; beresp.http.* ☉resp.*:由varnish響應給client相關; ☉obj.*:存儲在緩存空間中的緩存對象的屬性;隻讀; ★使用者自定義變量 set  unset 

 2.常用内建變量:

☉bereq.*, req.*: bereq.http.HEADERS bereq.request:      請求方法; bereq.url:              請求的url; bereq.proto:         請求的協定版本; bereq.backend:     指明要調用的後端主機; req.http.Cookie:    用戶端的請求封包中Cookie首部的值;  req.http.User-Agent ~ "chrome"  浏覽器的類型被chrome比對 ☉beresp.*, resp.*: beresp.http.HEADERS beresp.status:               響應的狀态碼; reresp.proto:                 協定版本; beresp.backend.name: BE主機的主機名; beresp.ttl:                     BE主機響應的内容的餘下的可緩存時長; ☉obj.* obj.hits:            此對象從緩存中命中的次數; obj.ttl:              對象的ttl值 ☉server.* server.ip server.hostname ☉client.* client.ip 附圖:  變量的使用範圍:
varnish 使用進階

示範1:

  強制對某類資源的請求不檢查緩存,這裡以login和admin類為例

1)首先在後端主機建立一個login的目錄并提供測試頁面,如下:

 2)此時請求login中的資源,可以看到第一次是後端主機直接響應的,之後都是命中緩存,由varnish直接響應,如下:

 3)現在,我們定義其請求封包,如果含有login和admin的就不從緩存中響應,編輯/etc/varnish/default.vcl,在vcl_recv定義如下:

varnish 使用進階

 4)配置生效,執行varnish_reload_vcl或者手動執行,如下:

 5)再次請求發現現在都是從後端主機直接響應的,不在命中緩存,如下:

示例總結:

varnish 使用進階

--------------------------------------------------------------------------------

    ---purge,ban

★purge: 清理單個url所對應的資源; ★ban: 清理表達式模式比對到的所有url緩存所對應的資源; ★能執行purge操作
varnish 使用進階
★何時執行purge操作
varnish 使用進階
★添加此類請求的通路控制法則:
varnish 使用進階

  收到使用者的請求方法為“purge”然後就執行return purage

------------------------------------------------------------------------------

  1)編輯/etc/varnish/default.vcl,在vcl_recv定義如下:

varnish 使用進階

 2)配置生效,執行varnish_reload_vcl或者手動執行,如下:

 3)使用curl指令請求,如下:

 4)現在,對能夠執行return purge 做acl通路控制,隻允許來自本機的網絡執行,編輯配置檔案如下:

varnish 使用進階

 配置生效,執行varnish_reload_vcl或者手動執行,如下:

  測試,我這裡不使用nginx反代,因為nginx和varnish在同一台主機,是以,使用者請求nginx的80服務,是由nignx反代至varnish,而varnish識别的是nginx反代的位址,不是使用者的位址,是以這裡為了示範效果,不使用nginx反代。然後在遠端主機請求,如下: