Varnish 學習筆記總結

        聲明:文中內容來自以下四個部分的學習筆記總結:

                  1.馬哥教育馬永亮老師講授的varnish課程

                  2.高俊峯先生寫的書籍《高性能Linux服務器構建實戰》中的varnish章節

                  3.陳明乾先生的51cto博客:http://freeloda.blog.51cto.com/2033581/1297414

                  4.互聯網文檔。

                  特此向以上先賢致敬!!

      內容概括:

                

一 varnish 簡要概括

    Varnish是一款輕量級的Cache和反向代理軟件。

    官方網站:https://www.varnish-cache.org/  (家中的廣電寬帶打不開該站點,不知是不是被牆了)


二 varnish同squid相比

     相同點:

            都是開源軟件

            都可做爲緩存和發向代理軟件使用

     varnish的優點:

             varnish訪問速度快。varnish將數據緩存在內存中,squid將緩存數據放置在磁盤上。

              varnish可以使用管理接口,使用正則表達式修剪緩存數據,squid做不到。

             varnish支持更多的併發連接。varnish的TCP連接釋放速度高於squid,在高併發的情況下支持更多的TCP連接。

      varnish的缺點:

              varnish的進程一旦崩潰,重啓,緩存在內存中的數據將會丟失,來自前段的訪問流量涌向後端

              varnish在負載較大的情況下,沒有squid穩定


三  varnish設計結構

wKioL1Vz1lWyRevXAAIIUtkkocE338.jpg

varnish運行的兩類進程:management進程和child/cache進程。

3.1)management進程作用:

     編譯VCL書寫的策略,應用新的配置,初始化varnish,監控child進程,提供管理接口

     management進程間隔數秒探測child進程,若timeout時間內沒有獲得迴應,會重啓child進程。

     management提供的管理接口有三種:命令行接口和telnet遠程接口,還有gui圖形接口(要收費的)。

3.2)child/cache進程作用:

      使用accept線程:接收新的連接請求並響應

      使用worker線程:child爲每一個會話啓用一個worker線程,在高併發場景中會有多個worker線程存在。

      使用expiry線程:從緩存中清理過期的內容

      使用Log/stats線程:管理日誌

      使用command line線程:管理接口

      使用storage/hashing線程:管理存儲

      使用backend communication線程:管理後端主機

3.3)日誌管理:

       varnish的日誌是共享內存日誌,線程若想寫日誌記錄信息,需維持持有一個鎖,然後向共享內存中的日誌區域寫入數據,然後再釋放鎖。對應worker線程,使用了日誌數據緩存功能,防止日誌寫入競爭。共享日誌大小一般爲90M,分爲2個部分:前一部分爲計數器,後一部分爲客戶端請求數據。


四 varnish的工作流程:

    wKioL1Vz4jnDIKsvAAHzqDwRyqc920.jpg

圖中橢圓形部分稱爲varnish的狀態節點,又稱爲狀態引擎,還有種叫法爲varnish的內置函數。


圖中紅色的線條:沒有查詢緩存/緩存中數據過期/緩存中沒有數據 情況下的流程

圖中黃顏色的線條:直接將匹配數據通過內置函數vcl_pipe送往後臺主機的流程

圖中綠色的線條:查詢緩存數據命中且數據沒有過期/經後臺主機返回的數據經被緩存後返回給客戶流程

圖中藍色的線條:數據沒有命中緩存向後臺主機發出查詢的流程

圖中黑色的線條:數據從後臺主機返回給varnish緩存的流程


圖中內置函數的作用:

4.1)vcl_recv:用於接收和處理請求,請求到達並被成功接受後被調用。

      四個主要用途:

修改客戶端請求數據減少緩存對象差異性:比如刪除URL中的www.字符

基於客戶端數據選用緩存策略:不如不緩存POST請求,

爲web應用程序執行URL重寫規則

挑選合適的後端服務器

      經常使用的終止語句:

pass:繞過緩存,不從緩存中查詢內容或不將內容存儲至緩存

pipe:不對客戶端進行檢查或做出任何操作,而是在客戶端與後臺服務間建立“管道“進行數據傳輸。

lookup:在緩存中查找用戶請求的對象

error :格式:error code [reason] ,向客戶端返回一個錯誤代碼code 和 原因resion,該reason可自定義


4.2)vcl_pipe:將請求直接傳遞至後端主機,在請求和返回的內容沒有改變的情況下,將不變的內容傳遞給客戶端,直到這個鏈接被關閉。

      經常使用的終止語句:

      pipe:說明見上

      error code [reason]:說明見上


4.3)vcl_hash: 在緩存中進行查詢

4.4)vcl_hit:在緩存中找到請求的內容

      經常使用的終止語句:

deliver:將找到的內容發送給客戶端,把控制權交個函數vcl_deliver

error code [reason]:說明見上

pass:將控制權交個vcl_pass函數處理,可能是緩存中數據過期所致


4.5)vcl_miss:當在緩存中沒有找到匹配數據時被調用

    經常使用的結束語:

error code [reason]:說明見上

pass:說明見上

fetch:表示從後端獲取的請求的內容,並將控制權交給VCL_fetch函數


4.6)vcl_pass:將請求直接傳遞給後端主機,後端主機將應答數據發送給客戶端,而不執行緩存,每次都返回最新內容。

      經常使用的結束語:

error code [reason]:說明見上

fetch:說明見上


4.7)vcl_fetch:向後端主機獲取內容,通過判斷將內容放入緩存,還是直接返回給客戶端。

     經常用的結束語:

error code [reason]:說明見上

deliver:將控制器交給vcl_deliver函數,將數據返回給客戶端

hit_no_pass:不緩存數據,直接返回給客戶端


4.8)vcl_deliver函數:將緩存中找到的數據返回給客戶端

      經常使用的結束語:

error code [reason]:說明見上

deliver:將內容返回給客戶端


五 vcl語句的書寫要素:

      Varnish Configuration Language(vcl)是varnish配置的緩存策略工具。

           是一種基於”域“的簡單編程語言;

           有內置的衆多變量和 set 自定義變量可以使用;

           支持if判斷語句,不支持循環語句;

           支持使用varnish內置函數的結束語,而沒有返回值;

           支持:=,==,~,!,&&,|| 邏輯操作符

           使用://,#,/*comment*/ 表示註釋

           使用:sub $NAME { }用於定義函數

5.1) vcl編寫的緩存策略---->management線程進行分析---->調用gcc編譯器--->編譯成二進制程序-->chaild/cache線程調用


5.2)vcl策略被編譯使用的操作:

假設vcl策略被定義在/etc/varnish/default.vcl文件中,varnishadm命令在安裝varnish後會生成。

#varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
>vcl.list

         ---->顯示現在使用的或者可以使用的vcl 配置
>vcl.load test1 default.vcl

         ---->執行編譯,加載/etc/varnish/default.vcl,並定義被編譯後的vcl策略版本名爲test1
>vcl.use test1   

         ---->將varnish現在使用的vcl策略版本切換使用test1所代表的配置
>help

         ----->列出該模式下可以使用的命令


5.3)vcl中內置的變量(全面的內置變量請參考官方站點文檔):

       (1)在任何引擎中均可使用:
            now:獲取當前時間

           .host:後端主機的主機名

           .port:後端主機的端口號

       (2)用於處理請求階段:
            client.ip:客戶端IP地址

            server.hostname:varnish的主機名

            server.ip:varnish的ip地址

            server.port:varnish的端口號
            req.request:請求方法
            req.url: 請求的URL
            req.proto: HTTP協議版本
            req.backend: 用於服務此次請求的後端主機;
            req.backend.healthy: 後端主機健康狀態;
            req.http.HEADER: 引用請求報文中指定的首部;
            req.can_gzip:客戶端是否能夠接受gzip壓縮格式的響應內容;
            req.restarts: 此請求被重啓的次數;

       (3)varnish向backend主機發起請求前可用的變量
            bereq.request: 請求方法
            bereq.url:請求的URL
            bereq.proto:HTTP的協議版本
            bereq.http.HEADER:請求報文中指定的首部
            bereq.connect_timeout: 等待與backend主機建立連接的超時時長

        (4)backend主機的響應報文到達本主機(varnish)後,將其放置於cache中之前可用的變量
            beresp.do_stream: 流式響應;
            beresp.do_gzip:是否壓縮之後再存入緩存;
            beresp.do_gunzip:是否不壓縮就存入緩存          

            beresp.http.HEADER:
            beresp.proto:
            beresp.status:響應狀態碼
            beresp.response:響應時的原因短語
            beresp.ttl:響應對象剩餘的生存時長,單位爲second;
            beresp.backend.name: 此響應報文來源backend名稱;
            beresp.backend.ip
            beresp..backend.port
            beresp.storage:將響應報文存儲在指定的存儲

        (5)緩存對象存入cache之後可用的變量
            obj.proto
            obj.status:響應時的狀態碼
            obj.response :響應是的原因短語
            obj.ttl
            obj.hits:緩存對象命中的次數
            obj.http.HEADER

       (6)在決定對請求鍵做hash計算時可用的變量
            req.hash:以指定查詢緩存的鍵做爲hash計算的鍵;
        (7)在爲客戶端準備響應報文時可用的變量
            resp.proto
            resp.status
            resp.response
            resp.http.HEADER

5.4)補充:

wKiom1V0Ai-C8y37AAFDPzcDddM318.jpg

      vcl書寫的規則應用在varnish的狀態節點上。

      vcl節點間彼此有相關性,但是彼此互相隔離

      vcl狀態節點使用return(xxxx)來退出到varnish而非下一個狀態節點

      varnish有一個默認vcl配置文件,若管理員在定義規則時將各個狀態節點規則寫明,則使用默認的

vcl配置文件中定義的節點規則實施


六 varnish的後端存儲

       varnish支持多種不同類型的後端存儲,這可以在varnishd啓動時使用-s選項指定。後端存儲的類型包括:
(1)file:使用特定的文件存儲全部的緩存數據,並通過操作系統的mmap()系統調用將整個緩存文件映射至內存區域(如果條件允許);
(2)malloc:使用malloc()庫調用在varnish啓動時向操作系統申請指定大小的內存空間以存儲緩存對象;
(3)persistent(experimental):與file的功能相同,但可以持久存儲數據(即重啓varnish數據時不會被清除);仍處於測試期;

       varnish無法追蹤某緩存對象是否存入了緩存文件,從而也就無從得知磁盤上的緩存文件是否可用,因此,file存儲方法在varnish停止或重啓時會清除數據。而persistent方法的出現對此有了一個彌補,但persistent仍處於測試階段,例如目前尚無法有效處理要緩存對象總體大小超出緩存空間的情況,所以,其僅適用於有着巨大緩存空間的場景。

       選擇使用合適的存儲方式有助於提升系統性,從經驗的角度來看,建議在內存空間足以存儲所有的緩存對象時使用malloc的方法,反之,file存儲將有着更好的性能的表現。然而,需要注意的是,varnishd實際上使用的空間比使用-s選項指定的緩存空間更大,一般說來,其需要爲每個緩存對象多使用差不多1K左右的存儲空間,這意味着,對於100萬個緩存對象的場景來說,其使用的緩存空間將超出指定大小1G左右。另外,爲了保存數據結構等,varnish自身也會佔去不小的內存空間。





下文的拓撲和IP設定

wKioL1V0PXmxSjcFAAJovnG9OSo568.jpg

七 varnish的配置與安裝

*作者這裏登不上varnish的官方站點,故使用馬哥教育提供的自制varnish rpm包來演示

1 安裝:

[root@Test01 source]# rpm -ivh varnish-libs-3.0.6-1.el6.x86_64.rpm
Preparing...                ########################################### [100%]
   1:varnish-libs           ########################################### [100%]
[root@Test01 source]# rpm -ivh varnish-3.0.6-1.el6.x86_64.rpm
Preparing...                ########################################### [100%]
   1:varnish                ########################################### [100%]

2 生成的配置文件:

[root@Test01 source]# rpm -ql varnish
/etc/logrotate.d/varnish    
/etc/rc.d/init.d/varnish      #啓動腳本
/etc/rc.d/init.d/varnishlog
/etc/rc.d/init.d/varnishncsa
/etc/sysconfig/varnish      #向varnish傳遞的參數
/etc/varnish
/etc/varnish/default.vcl    #默認的vcl規則配置
/usr/bin/varnish_reload_vcl    #varnish的管理工具
/usr/bin/varnishadm
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishreplay
/usr/bin/varnishsizes
/usr/bin/varnishstat
/usr/bin/varnishtest
/usr/bin/varnishtop
/usr/lib64/varnish
/usr/lib64/varnish/libvarnish.so
/usr/lib64/varnish/libvarnishcompat.so
/usr/lib64/varnish/libvcl.so
/usr/lib64/varnish/libvgz.so
/usr/lib64/varnish/vmods
/usr/lib64/varnish/vmods/libvmod_std.so
/usr/sbin/varnishd
/usr/share/doc/varnish-3.0.6       #生成的文檔
/usr/share/doc/varnish-3.0.6/ChangeLog
/usr/share/doc/varnish-3.0.6/LICENSE
/usr/share/doc/varnish-3.0.6/README
/usr/share/doc/varnish-3.0.6/README.redhat
/usr/share/doc/varnish-3.0.6/examples
/usr/share/doc/varnish-3.0.6/examples/default.vcl
/usr/share/doc/varnish-3.0.6/examples/zope-plone.vcl
/usr/share/man/man1/varnishadm.1.gz    #生成的man手冊頁
/usr/share/man/man1/varnishd.1.gz
/usr/share/man/man1/varnishhist.1.gz
/usr/share/man/man1/varnishlog.1.gz
/usr/share/man/man1/varnishncsa.1.gz
/usr/share/man/man1/varnishreplay.1.gz
/usr/share/man/man1/varnishsizes.1.gz
/usr/share/man/man1/varnishstat.1.gz
/usr/share/man/man1/varnishtest.1.gz
/usr/share/man/man1/varnishtop.1.gz
/usr/share/man/man3/vmod_std.3.gz
/usr/share/man/man7/varnish-cli.7.gz
/usr/share/man/man7/varnish-counters.7.gz
/usr/share/man/man7/vcl.7.gz
/var/lib/varnish
/var/log/varnish                   #自身的日誌文件
[root@Test01 source]#


3 配置文件說明:

[root@Test01 source]#vim /etc/sysconfig/varnish

[root@Test01 source]# grep -E -v '(^#|^$)' /etc/sysconfig/varnish
NFILES=131072       --->打開的最大文件數,varnish自動調整該值

MEMLOCK=82000  --->內存中共享日誌空間的大小
NPROCS="unlimited"  -->單個用戶運行的線程數
RELOAD_VCL=1           -->設置爲1 ,表示自動狀態vcl策略配置文件無需重啓varnish服務
VARNISH_VCL_CONF=/etc/varnish/default.vcl   --->默認vcl策略文件的位置
VARNISH_LISTEN_PORT=80                          --->varnish監聽的端口
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1  --->varnish提供telnet管理端口監聽的地址
VARNISH_ADMIN_LISTEN_PORT=6082              --->varnish提供telnet管理端口監聽的端口VARNISH_SECRET_FILE=/etc/varnish/secret      --->varnish爲管理端口提供的共享密鑰文件
VARNISH_MIN_THREADS=50                           --->varnish啓動時啓動最少的線程數
VARNISH_MAX_THREADS=1000                       --->varnish啓動時啓動最多的線程數VARNISH_THREAD_TIMEOUT=120             --->varnish線程數的空閒時間,超過該時間自動銷燬線程

VARNISH_STORAGE_MEM=100M               -->使用內存爲存儲設備時使用的空間大小

 VARNISH_STORAGE="malloc,${VARNISH_STORAGE_MEM}"                               

                                  --->當varnish後端存儲的配置,使用內存用來緩存數據,大小爲100M

VARNISH_TTL=120   
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
             -f ${VARNISH_VCL_CONF} \
             -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
             -t ${VARNISH_TTL} \
             -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
             -u varnish -g varnish \
             -S ${VARNISH_SECRET_FILE} \
             -s ${VARNISH_STORAGE}"
[root@Test01 source]#

[root@Test01 source]# service varnish start
Starting Varnish Cache:                                    [  OK  ]

[root@Test01 source]# ss -tlpn | grep 'varnish'
LISTEN     0      10                127.0.0.1:6082                     *:*      users:(("varnishd",2505,6))
LISTEN     0      128                      :::80                      :::*      users:(("varnishd",2506,8))
LISTEN     0      128                       *:80                       *:*      users:(("varnishd",2506,7))
[root@Test01 source]#

八 簡單的配置使用:

8.1)配置一個簡單的varnish實例:

    (1):設定vcl規則配置文件:

[root@Test01 source]# cd /etc/varnish/
[root@Test01 varnish]# ls
default.vcl  secret
[root@Test01 varnish]# cp default.vcl  test.vcl
[root@Test01 varnish]# vim test.vcl
backend backwebserver {
   .host = "172.16.100.6";
   .port = "80";
 }
sub vcl_recv {
         set req.backend = backwebserver;
 }

* 在這個配置中只是設定了後端的webserver的地址,在varnish的 vcl_recv狀態引擎上調用了一下

其它的vcl規則並沒設定,varnish默認從/etc/varnish/default.vcl中加載

    (2):讓varnish加載該vcl規則文件:

[root@Test01 varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200        
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.32-504.el6.x86_64,x86_64,-smalloc,-smalloc,-hcritbit
varnish-3.0.6 revision 1899836

Type 'help' for command list.
Type 'quit' to close CLI session.

varnish> vcl.list
200        
active          0 boot

varnish> vcl.load test1 test.vcl
200        
VCL compiled.
varnish> vcl.use test1
200       
     (3)在客戶機上訪問下varnish監聽的地址,觀察包頭

wKiom1V0HRPSRiXRAANaYN69i-E291.jpg

     

8.2)配置varnish實例,顯示命中: 

 (1)上面的包頭中並沒有顯示是否命中,修改下vcl規則

[root@Test01 varnish]# vim test.vcl 

backend backwebserver {

   .host = "172.16.100.6";
  .port = "80";
}
sub vcl_recv {
        set req.backend = backwebserver;
}
sub vcl_deliver {
        if (obj.hits > 0) {
                set resp.http.X-Cache = "Hit from"+" "+server.ip;
        } else {
                set resp.http.X-Cache = "Miss via"+" "+server.ip;
        }   
}

(2)加載新的vcl規則文件

[root@Test01 varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200        
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.32-504.el6.x86_64,x86_64,-smalloc,-smalloc,-hcritbit
varnish-3.0.6 revision 1899836

Type 'help' for command list.
Type 'quit' to close CLI session

varnish> vcl.load test2 test.vcl
200        
VCL compiled.
varnish> vcl.use test2
200 

    (3)再此刷新瀏覽器,查看包頭信息

wKiom1V0HzHhACyhAAOfJ5fq348774.jpg

    (6)在上圖中沒有命中,那麼我們再次刷新瀏覽器觀察

wKiom1V0H6SgJSjTAAOGLwf-Fjg186.jpg

8.3)配置varnish實例,讓bbs/路徑下文件的不緩存:

(1)後端主機上bss/index.html文件的設定:

[root@Test01 varnish]# !ssh
ssh 172.16.100.6
[email protected]'s password:
Last login: Sun Jun  7 19:15:46 2015 from 172.16.100.1
[root@Test06 ~]# cd /var/www/html/bbs
[root@Test06 bbs]# ls
index.html
[root@Test06 bbs]# cat index.html
<h1>BBS 100.6</h1>
[root@Test06 bbs]# exit
logout
Connection to 172.16.100.6 closed.
[root@Test01 varnish]# curl http://172.16.100.6/bbs/index.html
<h1>BBS 100.6</h1>
[root@Test01 varnish]#

(2)修改vcl規則文件:

[root@Test01 varnish]# vim test.vcl

backend backwebserver {
  .host = "172.16.100.6";
  .port = "80";
}
sub vcl_recv {
        if (req.url ~ "^/bbs/") {
                return(pass);
        }   
        set req.backend = backwebserver;
}
sub vcl_deliver {
        if (obj.hits > 0) {
                set resp.http.X-Cache = "Hit from"+" "+server.ip;
        } else {
                set resp.http.X-Cache = "Miss via"+" "+server.ip;
        }
}

(3)varnish重新加載vcl規則文件:

[root@Test01 varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200        
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.32-504.el6.x86_64,x86_64,-smalloc,-smalloc,-hcritbit
varnish-3.0.6 revision 1899836

Type 'help' for command list.
Type 'quit' to close CLI session

varnish> vcl.load test3 test.vcl
200        
VCL compiled.
varnish> vcl.use test3
200

(4)客戶端瀏覽器中觀察:

wKioL1V0K5qjf9AzAAM5XAQ9gAo962.jpg

九 配置varnish支持後端多臺服務器:

9.1)案例1:實現請求內容實現動靜分離

[root@Test01 varnish]# vim test.vcl

backend bkws1 {

    .host= "172.16.100.6";

    .port= "80";

}

backend bkws2 {

    .host= "172.16.100.7";

    .port = "80";

}

sub vcl_recv {

    if (req.url ~ "\.php$") {

      set req.backend = bkws1;

    }

    if (req.url~ "\.(html|css|js|jpg|jpeg|png|gif)$") {

      set req.backend = bkws2;

    }

}

sub vcl_deliver {

     if (obj.hits > 0) {

        set resp.http.X-Cache = "Hitfrom"+" "+server.ip;

    } else {

        set resp.http.X-Cache = "Missvia"+" "+server.ip;

    }

 }


9.2)案例2,讓後臺支持個服務器

[root@Test01 varnish]# vim test.vcl

backend bkwb1{
  .host = "172.16.100.6";
  .port = "80";
}
backend bkwb2{
  .host = "172.16.100.7";
  .port = "80";
}
director webserver random {
        { .backend = bkwb1; .weight = 1; }
        { .backend = bkwb2; .weight = 1; }
}
sub vcl_recv {
        set req.backend = webserver;
        }   
sub vcl_deliver {
        if (obj.hits > 0) {
                set resp.http.X-Cache = "Hit from"+" "+server.ip;
        } else {
                set resp.http.X-Cache = "Miss via"+" "+server.ip;
        }   
}


十 配置對後端主機進行健康狀態檢測

[root@Test01 varnish]# vim test.vcl

  7 probe bc {
  8         .url = "/index.html";
  9         .interval = 60s;
 10         .timeout = 0.3s;
 11         .window = 8;
 12         .threshold = 3;
 13         .initial = 3;
 14         .expected_response = 200;
 15 }
 16 backend bkwb1{
 17   .host = "172.16.100.6";
 18   .port = "80";
 19   .probe = bc;
 20 }
 21 backend bkwb2{
 22   .host = "172.16.100.7";
 23   .port = "80";
 24   .probe = bc;
 25 }

      上面代碼中的7-15定義了後臺主機的健康檢查策略,在下面的2個後臺主機定義中分別被調用。

      Varnish可以檢測後端主機的健康狀態,在判定後端主機失效時能自動將其從可用後端主機列表中移除,而一旦其重新變得可用還可以自動將其設定爲可用。爲了避免誤判, Varnish在探測後端主機的健康狀態發生轉變時(比如某次探測時某後端主機突然成爲不可用狀態),通常需要連續執行幾次探測均爲新狀態纔將其標記爲轉換後的狀態。每個後端服務器當前探測的健康狀態探測方法通過.probe進行設定。

.probe中的探測指令常用的有:
        (1) .url:探測後端主機健康狀態時請求的URL,默認爲“/”;
        (2) .request: 探測後端主機健康狀態時所請求內容的詳細格式,定義後,它會替換.url指定的探測方式;比如:
            .request =
                "GET /.healthtest.html HTTP/1.1"
                "Host: www.magedu.com"
                "Connection: close";
        (3) .window:設定在判定後端主機健康狀態時基於最近多少次的探測進行,默認是8;
        (4) .threshold:在.window中指定的次數中,至少有多少次是成功的才判定後端主機正健康運行;默認是3;
        (5) .initial:Varnish啓動時對後端主機至少需要多少次的成功探測,默認同.threshold;
        (6) .expected_response:期望後端主機響應的狀態碼,默認爲200;
        (7) .interval:探測請求的發送週期,默認爲5秒;
        (8) .timeout:每次探測請求的過期時長,默認爲2秒;


十一 清除單個緩存對象

[root@Test01 varnish]# vim test.vcl

7 backend bkws1 {
  8   .host = "172.16.100.6";
  9   .port = "80";
 10 }
 11 acl purgers {
 12                         "127.0.0.1";
 13                         "192.168.100.3"/24;
 14 }
 15 sub vcl_recv {
 16         if (req.request == "PURGE") {
 17                 if (!client.ip ~ purgers) {
 18                    error 405 "Method not allowed";
 19                 }
 20                 return (lookup);
 21 }
 22         set req.backend = bkws1;
 23 }
24 sub vcl_hit {
 25         if (req.request == "PURGE") {
 26                 purge;
 27                 error 200 "Purged";
 28         }
 29 }
 30
 31 sub vcl_miss {
 32         if (req.request == "PURGE") {
 33         purge;
 34         error 404 "Not in cache";
 35         }
 36 }
 37
 38 sub vcl_pass {
 39         if (req.request == "PURGE") {
 40         error 502 "PURGE on a passed object";
 41         }
 42 }
 43
 44 sub vcl_deliver {
 45         if(obj.hits>0){
 46                 set resp.http.X-Cache = "Hit from"+" "+server.ip;
 47         }else{
 48                 set resp.http.X-Cache = "Miss via"+" "+server.ip;
 49         }
 50 }
    11~14行定義了一個允許進行修剪的地址列表;然後分別在vcl_revc vcl_hit  vcl_miss vcl_pass中分別定義針對請求中包含有PURGE的怎樣進行清除緩存及應對代碼。

這是清除之前的:

wKiom1V28OXRmsRwAASRq_6tlB0400.jpg

下面是進行清除和使用瀏覽器進行驗證的:

wKiom1V28RKT-BetAAds2oLItwg691.jpg





   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章