vcl狀態引擎介紹,varnish安裝配置

內容概覽:

1、varnish介紹
2、Varnish程序結構
3、Vcl內置函數和處理流程(狀態引擎)
4、配置拓撲和環境說明
5、varnish安裝和簡單配置
6、移除單個緩存對象
7、在vcl中使用條件判斷
8、動靜分離
9、健康狀態檢測
10、負載均衡
11、varnish的線程模型

1、varnish介紹

Varnish是一款高性能的開源HTTP加速器(其實就是帶緩存的反向代理服務),可以把http響應內容緩存到內存或文件中,從而提高web服務器響應速度。與傳統的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等諸多優點,很多大型的網站都開始嘗試使用 varnish 來替換 squid,這些都促進 varnish 迅速發展起來。挪威最大的在線報紙 Verdens Gang 使用3Varnish代替了原來的12Squid,性能比以前更好。

官方地址:

https://www.varnish-cache.org/

2、Varnish程序結構

clip_image002

管理進程:編譯VCL並應用新配置、監控varnish、初始化varnish,並提供一個CLI。

Child/Cache線程有幾類:

    Acceptor:接收新的連接請求;

    Worker:用於處理並響應用戶請求;

    Expiry:從緩存中清理過期cache object

 

日誌:Shared Memory Log,  共享內存內存日誌大小一般90MB;分爲兩部分:前一部分爲計數器、後一部分爲客戶請求相關的數據。


3、Vcl內置函數和處理流程(狀態引擎

Vcl內置函數:vcl配置的緩存策略在此些內置函數發揮作用;

vcl_recv:用於接受和處理請求。當請求到達併成功接收後被調用,通過判斷請求的數據來決定如何處理請求。例如如何響應、怎麼響應、使用哪個後端服務器等。

vcl_fetch:根據服務器端的響應作出緩存決策,如判斷獲取的內容來決定是將內容放入緩存,還是直接返回給客戶端。

vcl_pipe:對於無法理解的用戶請求,將請求直接發往後端主機;

vcl_hash:自定義hash生成時的數據來源

vcl_pass:用於將請求直接傳遞至後端主機,後端主機在應答數據後將應答數據發送給客戶端,但不進行任何緩存。

vcl_hit:從緩存中查找到緩存對象時要執行的操作;

vcl_miss:從緩存中款查找到緩存對象時要執行的操作;

vcl_deliver:將用戶請求的內容響應給客戶端時用到的方法; 

vcl_error:在varnish端合成錯誤響應而時;

 

vcl的配置語法:

    (1) //, #, /*comment*/用於註釋;

    (2) sub $NAME 用於定義函數;

    (3) 不支持循環;

    (4) 有衆多內置變量;

    (5) 支持終止語句,沒有返回值;

    (6) “域”專用語言;

    (7) 操作符: =, ==, ~, !, &&, ||

 

vcl狀態轉換圖:

每個請求都被單獨處理,處理過程中將處在不同的狀態。退出一種狀態就會轉入下一個狀態。狀態之間是有關聯的,而不是孤立的,下面的圖中可以清楚的看出狀態的轉換,以及不同狀態所要經過的處理函數。

官方原圖:

clip_image004


自己手繪的中文版(不求準確,但求理解)

clip_image006

常用變量:

    1、在任何引擎中均可使用:

        Now:獲取當前系統當前時間

.host:獲取當前主機名和ip地址

.port:後端服務器名稱和端口

 

    2、用於處理請求階段:

        client.ip,server.hostname, server.ip, server.port :都不解釋

        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:等待與beckend建立連接的超時時長

 

    4、backend主機的響應報文到達本主機(varnish)後,將其放置於cache中之前可用的變量

        beresp.do_stream:流式響應(接收一個請求,響應一個請求)

        beresp.do_gzip:是否壓縮之後再存入緩存;

        beresp.do_gunzip:如果從後端收到壓縮格式的報文,是否解壓縮在存放下來

        beresp.http.HEADER:獲取httpd的首部信息

        beresp.proto:HTTP協議版本

        beresp.status:響應狀態碼

        beresp.response:響應時的原因短語

        beresp.ttl:響應對象剩餘的生存時長,單位爲秒鐘;

        beresp.backend.name:此響應報文來源backend名稱;

        beresp.backend.ip:獲取後端響應ip

        beresp.backend.port:獲取後端響應端口

        beresp.storage:強制varnish將緩存存儲到緩存後端

 

    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:調用響應報文狀態碼

 

各類報文使用位置和使用權限:

clip_image008


4、配置拓撲和環境說明:

clip_image010

主機名

Ip地址

功能描述

Varnish

172.16.4.100

接收用戶訪問,並且將請求轉發到後端web服務,最後將請求結果緩存

Web-01

172.16.4.101

提供web服務

Web-02

172.16.4.102

提供web服務

所有服務器系統環境如下:

[root@varnish ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)
[root@varnish ~]# uname -r
2.6.32-504.el6.x86_64 
[root@varnish ~]# uname -m
x86_64

Web服務器已經配置好服務,並且varnish服務器可以訪問,結果如下配置過程略:

[root@varnish ~]# curl 172.16.4.101
web-01
[root@varnish ~]# curl 172.16.4.102
web-02

5、varnish安裝和簡單配置

安裝varnish

此處使用的varnish軟件爲3.0.6

下載地址:https://repo.varnish-cache.org/redhat/varnish-3.0/el6/x86_64/varnish/

[root@node1 ~]# ll varnish-*
-rw-r--r-- 1 root root 454496 Oct 21  2014 varnish-3.0.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 360284 Oct 21  2014 varnish-docs-3.0.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root  42620 Oct 21 2014 varnish-libs-3.0.6-1.el6.x86_64.rpm
[root@node1 ~]# rpm -ivh *.rpms

安裝完成生成的文件:

/etc/sysconfig/varnish     #配置文件

/etc/varnish/default.vcl   #vcl配置

/usr/sbin/varnishd          #主程序


varnish啓動參數:

  -a:指定監聽地址和端口

  -b:指明後端主機和端口

  -C:顯示vcl編譯後的代碼,轉換成c語言後退出

  -d:打開debug模式

  -F:運行在前臺

  -fconfig:指明配置文件

  -g:指明以哪個組的身份運行

  -h:指明哈希算法

  -l:共享內存區域大小

  -n:當前實例的名稱

  -P:指明pid文件

  -s:使用指定的存儲後端

  -T:提供一個管理接口,默認是6081,推薦設置爲80

支持的哈希算法:

   simple_list

   classic

   critbit

varnish支持後端緩存存儲機制:

    -stype

        malloc[,size]        #表示在內存中緩存

        file[,path[,size[,granularity]]]   #使用一個文件來保存所有的緩存

        persistent,path,size   #不成熟的存儲機制

說明:varnish服務只要一重啓會清空所有緩存

 


Varnish配置選擇,一共有四種分別是

## Alternative 1  最小化配置

## Alternative 2  表示使用cvl緩存配置

## Alternative3  高級配置         

## Alternative 4  自定義配置

 

這裏選擇使用alternative 3:修改varnish配置文件,這裏設置爲將緩存放到內存中大小是64M

[root@varnish ~]# vim /etc/sysconfig/varnish
VARNISH_VCL_CONF=/etc/varnish/default.vcl        #指定緩存策略配置文件
VARNISH_LISTEN_PORT=80                           #varnish監聽端口
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1           #管理地址
VARNISH_ADMIN_LISTEN_PORT=6082                   #管理端口
VARNISH_SECRET_FILE=/etc/varnish/secret          #密鑰文件
VARNISH_MIN_THREADS=50                           #最少線程:varnish在啓動時最少啓動多少線程
VARNISH_MAX_THREADS=3000                         #最多啓動線程(據說啓動超過5000後不是特別穩定)
VARNISH_THREAD_TIMEOUT=120                       #線程超時時間
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin  #緩存文件
VARNISH_STORAGE_SIZE=1G                          #緩存大小
VARNISH_STORAGE_SHM=64M                          #定義內存大小
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SHM}"  #將緩存定義到內存中,指定的大小爲VARNISH_STORAGE_SHM變量定義的值
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}"

設置完成varnish配置文件,啓動服務就可以正常監聽80端口,但是,由於沒有後端主機所以無法響應客戶端請求,需要修改default.vcl進行緩存相關配置

 

添加後端主機,這裏先添加一個172.16.4.101

[root@varnish ~]# vim /etc/varnish/default.vcl
backend default {
  .host ="172.16.4.101";
  .port ="80";
}

啓用如下配置:

#表示後端web服務器記錄地址爲客戶端地址,而不是varnish地址
 } subvcl_recv {
     if(req.restarts == 0) {
        if(req.http.x-forwarded-for) {
           set req.http.X-Forwarded-For =
               req.http.X-Forwarded-For + ", " + client.ip;
        }else {
           set req.http.X-Forwarded-For = client.ip;
        }
     }
#如果請求中不包含GET,HEAD,PUT,POST,TRACE,OPTIONS,DLETE,將請求發往後端
     if(req.request != "GET" &&
      req.request != "HEAD" &&
       req.request!= "PUT" &&
      req.request != "POST" &&
      req.request != "TRACE" &&
      req.request != "OPTIONS" &&
      req.request != "DELETE") {
         /*Non-RFC2616 or CONNECT which is weird. */
        return (pipe);
     }
#如果請求不是GET和HEAD,那麼將請求發送給pass
     if(req.request != "GET" && req.request != "HEAD") {
         /*We only deal with GET and HEAD by default */
        return (pass);
     }
#如果報文中有Cookie信息,那麼不應該緩存
     if(req.http.Authorization || req.http.Cookie) {
         /*Not cacheable by default */
        return (pass);
     }
     return(lookup);
 }
#驗證緩存命中
sub vcl_deliver {
  if(obj.hits>0) {
          set resp.http.X-Cache = "HIT";
   } else {
          set resp.http.X-Cache = "MISS";
       }
    return(deliver);
}

設置完成啓動服務,只要保證80和6082端口爲varnish監聽即可

[root@varnish ~]# service varnish start
[root@varnish ~]# netstat -lntup | grep -E"80|6082"
tcp       0      0 127.0.0.1:6082              0.0.0.0:*                   LISTEN      53510/varnishd     
tcp       0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      53511/varnishd

 

設置完成訪問兩次就可以看到,看定義的X-Cache的值爲HIT表示緩存成功

clip_image012

6、移除單個緩存對象

purge用於清理緩存中的某特定對象及其變種(variants),因此,在有着明確要修剪的緩存對象時可以使用此種方式。HTTP協議的PURGE方法可以實現purge功能,不過,其僅能用於vcl_hit和vcl_miss中,它會釋放內存工作並移除指定緩存對象的所有Vary:-變種,並等待下一個針對此內容的客戶端請求到達時刷新此內容。另外,其一般要與return(restart)一起使用。下面是個在VCL中配置的示例。

#指定允許使用purgers的地址
acl purgers {      
    "127.0.0.1";
    "192.168.0.0"/24;
}
#如果請求purers的地址不是指定的客戶端地址,返回405錯誤
sub vcl_recv {      
    if(req.request == "PURGE") {
       if(!client.ip ~ purgers) {
           error405 "Method not allowed";
       }
       return(lookup);
    }
}           
#如果緩存命中,而且請求方法是purgers則刪除緩存,並且返回200響應碼          
sub vcl_hit {           
    if(req.request == "PURGE") {
       purge;
       error200 "Purged";
    }
}        
#如果請求是purgers,但是沒有緩存則返回404錯誤           
sub vcl_miss {       
    if(req.request == "PURGE") {
       purge;
       error404 "Not in cache";
    }
}
#如果將請求發送給了pass返回502錯誤
sub vcl_pass {      
    if(req.request == "PURGE") {
       error502 "PURGE on a passed object";
    }
}

啓用默認vcl_recv配置時使用的方式:需要運行允許運行PURGE

subvcl_recv {
         if (req.restarts == 0) {
            if (req.http.x-forwarded-for) {
                set req.http.X-Forwarded-For =
                    req.http.X-Forwarded-For +", " + client.ip;
            } else {
                set req.http.X-Forwarded-For =client.ip;
            }
         }
         if (req.request == "PURGE" ) {
            if (!client.ip ~ purgers) {
                error 405 "Method notallowed.";
            }
         }
         if (req.request != "GET"&&
           req.request != "HEAD"&&
           req.request != "PUT"&&
           req.request != "POST"&&
           req.request != "TRACE"&&
           req.request != "OPTIONS"&&
           req.request != "DELETE"&&
           req.request != "PURGE" ){       #此處需要添加PURGE
             /* Non-RFC2616 or CONNECT which isweird. */
             return (pipe);
         }
         if (req.request != "GET"&& req.request != "HEAD" && req.request !="PURGE") {   #此處需要添加PURGE
             /* We only deal with GET and HEAD bydefault */
             return (pass);
         }
         if (req.http.Authorization ||req.http.Cookie) {
             /* Not cacheable by default */
             return (pass);
         }
         return (lookup);
    }

這個時候就配置完成了,但是這樣做有一個問題,那就是varnish服務一旦重啓就會清除所有緩存數據,顯然這個是不可取的方案。

可以使用varnishadm命令打開varnish的管理接口應用新的配置文件

連接varnishadm,並且列出常用參數

[root@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> help        
200       
help [command]
ping [timestamp]        #測試服務器活動狀態的
auth response           #做認證的
quit                    #退出
banner                  #顯示banner信息
status                  #顯示當前服務器狀態信息
start                   #啓動子進程
stop                    #關閉子進程
vcl.load <configname> <filename>       #裝載val信息
vcl.inline <configname><quoted_VCLstring> 
vcl.use <configname>                   #使用新的vcl配置
vcl.discard <configname>               #刪除
vcl.list                               #顯示當前所有vcl配置
vcl.show <configname>                  #顯示vcl內置詳細信息
param.show [-l] [<param>]  
param.set <param> <value> 
panic.show                   
panic.clear                  
storage.list                 
backend.list                 
backend.set_health matcher state  
ban.url <regexp>
ban <field> <operator> <arg>[&& <field> <oper> <arg>]...
ban.list

設置使用新配置文件

varnish> vcl.load test1 default.vcl    #裝載default.vcl配置文件,並命名爲test1
200       
VCL compiled.
varnish> vcl.list
200       
active         2 boot      #boot處於活動狀態
available      0 test1     #test1已經存在
 
varnish> vcl.use test1     #使用test1配置文件
200        
 
varnish> vcl.list
200       
available      2 boot
active         0 test1    #現在處於活動狀態的就是test1

驗證:是否可以手動移除單個緩存

[root@varnish ~]# curl -Ihttp://172.16.4.100/index.html
HTTP/1.1 200 OK
Server: Apache/2.2.15 (CentOS)
Last-Modified: Wed, 27 May 2015 01:40:12 GMT
ETag: "80101-5-5170652f10295"
Content-Type: text/html; charset=UTF-8
Content-Length: 5
Accept-Ranges: bytes
Date: Wed, 27 May 2015 10:50:53 GMT
X-Varnish: 989040343 989040342
Age: 1
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT               #正常訪問緩存是命中的
[root@varnish ~]# curl -I -X PURGEhttp://172.16.4.100/index.html
HTTP/1.1 200 Purged
Server: Varnish
Content-Type: text/html; charset=utf-8
Retry-After: 5
Content-Length: 379
Accept-Ranges: bytes
Date: Wed, 27 May 2015 10:51:33 GMT
X-Varnish: 989040344
Age: 0
Via: 1.1 varnish
Connection: close
X-Cache: MISS             #使用PURGE緩存沒有命中,表示緩存已經被刪除了

7、在vcl中使用條件判斷

單分支:

    if(CONDITION) {
       ...;
    }

雙分支:

    if(CONDITION) {
       ...;
    } else {
       ...;
    }

多分支:

    if(CONDITION1) {
       ...
    } elseif(CONDITION2) {
       ...
    } else {
       ...
    }

上面驗證命中的vcl就是一個雙分支的判斷語句:

if(obj.hits>0) {
    setresp.http.X-Cache = "HIT";       
} else {
    setresp.http.X-Cache= "MISS";
}

一個多分支if判斷語句:

       subvcl_recv {
         if (req.http.host ~ "(?i)^(www.)?xmfb.com$"){
           set req.http.host = "www.xmfb.com";      #將訪問www.xmfb.com的請求轉發到www主機
           set req.backend = www;
         } elsif (req.http.host ~ "(?i)^images.xmfb.com$"){
           set req.backend = images;      #將訪問images.xmfb.com的請求轉發到images的主機
         } else {
           error 404 "Unknown virtual host";   #其他請求404響應
         }
       }


示例:拒絕指定IP訪問,sub vcl_recv中定義單分支if語句即可

     if(client.ip == "172.16.4.199") {     #如果客戶端ip是172.16.4.199
        error404 "haha";                    #返回404錯誤即可
     }

設置完成重載服務

varnish> vcl.load test2 default.vcl
varnish> vcl.use test2

172.16.4.199客戶端訪問如下所示:

clip_image014

8、動靜分離

Varnish中可以使用director指令將一個或多個近似的後端主機定義爲一個邏輯組,並可以指定的調度方式(也叫挑選方法)來輪流將請求發送至這些主機上。不同的director可以使用同一個後端主機,而某director也可以使用“匿名”後端主機(在director中直接進行定義)。每個director都必須有其專用名,且在定義後必須在VCL中進行調用,VCL中任何可以指定後端主機的位置均可以按需將其替換爲調用某已定義的director。

 配置示例:

#定義兩個後端主機,如果指定多個後端後端主機必須在配置文件中指明調用指定的後端主機
backend web1 {
  .host ="172.16.4.101";
  .port ="80";
}
 
backend web2 {
  .host ="172.16.4.102";
  .port ="80";
}       
#配置動靜分離:只需要在sub vcl_recv中定義一個雙分支判斷,將php結尾的內容交給web1,其他內容
     if(req.url ~ "\.php$") {
        setreq.backend = web1;
     } else {
        setreq.backend = web2;
     }

9、健康狀態檢測

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

 

每個後端服務器當前探測的健康狀態探測方法通過.probe進行設定,其結果可由req.backend.healthy變量獲取,也可通過varnishlog中的Backend_health查看或varnishadm的debug.health查看。

 配置示例:

probe chk {
  .window =5;
  .threshold= 3;
  .interval=3s;
  .timeout =1s;
}
 
backend web1 {
  .host ="172.16.4.101";
  .port ="80";
  .probe =chk;
}
 
backend web2 {
  .host ="172.16.4.102";
  .port ="80";
  .probe =chk;
}

.probe中的探測指令常用的有:

(1) .url:探測後端主機健康狀態時請求的URL,默認爲“/”;

(2) .request: 探測後端主機健康狀態時所請求內容的詳細格式,定義後,它會替換.url指定的探測方式;比如:

    .request=

        "GET/.healthtest.html HTTP/1.1"

        "Host:www.xmfb.com"

        "Connection:close";

(3) .window:設定在判定後端主機健康狀態時基於最近多少次的探測進行,默認是8;

(4) .threshold:在.window中指定的次數中,至少有多少次是成功的才判定後端主機正健康運行;默認是3;

(5) .initial:Varnish啓動時對後端主機至少需要多少次的成功探測,默認同.threshold;

(6) .expected_response:期望後端主機響應的狀態碼,默認爲200;

(7) .interval:探測請求的發送週期,默認爲5秒;

(8) .timeout:每次探測請求的過期時長,默認爲2秒; 

 

驗證:在管理接口使用backend.list命令可以查看後端服務器狀態

varnish> backend.list
200       
Backend name                   Refs   Admin     Probe
default(172.16.4.101,,80)      4     probe      Healthy (no probe)
web1(172.16.4.101,,80)         4     probe      Healthy 5/5        #表示檢查了後端服務器5次,5次都是正常的
web2(172.16.4.102,,80)         4     probe      Healthy 5/5

當掉web-01服務器,在查看後端服務器狀態

varnish> backend.list
200       
Backend name                   Refs   Admin     Probe
default(172.16.4.101,,80)      4     probe      Healthy (no probe)
web1(172.16.4.101,,80)         4     probe      Sick 0/5      #表示後端服務器掛了
web2(172.16.4.102,,80)         4     probe      Healthy 5/5

說明:如果進行訪問測試已掛服務器還正常,說明內容是從緩存中返回的

10、負載均衡

Varnish中可以使用director指令將一個或多個近似的後端主機定義爲一個邏輯組,並可以指定的調度方式(也叫挑選方法)來輪流將請求發送至這些主機上。不同的director可以使用同一個後端主機,而某director也可以使用“匿名”後端主機(在director中直接進行定義)。每個director都必須有其專用名,且在定義後必須在VCL中進行調用,VCL中任何可以指定後端主機的位置均可以按需將其替換爲調用某已定義的director。

 配置示例:

#定義多個後端主機並配置健康檢查
probe chk{
  .window = 5;
  .threshold = 3;
  .interval =3s;
  .timeout = 1s;
}
backendweb1 {
  .host = "172.16.4.101";
  .port = "80";
  .probe = chk;
}
 
backendweb2 {
  .host = "172.16.4.102";
  .port = "80";
  .probe = chk;
}
# 負載均衡定義
director webservers random {
   .retries = 3;
    {
       .backend = web1;
        .weight = 1;
     }
    {
       .backend = web2;
       .weight = 1;
    }
}
# 設置完成負載均衡,必須要調用,否則會報錯
   set req.backend = webservers;

如上示例中,web1爲顯式定義的後端主機,而webservers這個directors還包含了一個“匿名”後端主機(backweb2.xmfb.com)。webservers從這兩個後端主機中挑選一個主機的方法爲random,即以隨機方式挑選。

 

Varnish的director支持的挑選方法中比較簡單的有round-robin和random兩種。其中,round-robin類型沒有任何參數,只需要爲其指定各後端主機即可,挑選方式爲“輪叫”,並在某後端主機故障時不再將其視作挑選對象;random方法隨機從可用後端主機中進行挑選,每一個後端主機都需要一個.weight參數以指定其權重,同時還可以director級別使用.retires參數來設定查找一個健康後端主機時的嘗試次數。

 

Varnish 2.1.0後,random挑選方法又多了兩種變化形式client和hash。client類型的director使用client.identity作爲挑選因子,這意味着client.identity相同的請求都將被髮送至同一個後端主機。client.identity默認爲client.ip,但也可以在VCL中將其修改爲所需要的標識符。類似地,hash類型的director使用hash數據作爲挑選因子,這意味着對同一個URL的請求將被髮往同一個後端主機,其常用於多級緩存的場景中。然而,無論是client還hash,當其傾向於使用後端主機不可用時將會重新挑選新的後端其機。

 

另外還有一種稱作fallback的director,用於定義備用服務器,如下所示:

       directorb3 fallback {
         { .backend = www1; }
         { .backend = www2; } // will only be used ifwww1 is unhealthy.
         { .backend = www3; } // will only be used ifboth www1 and www2
                              // are unhealthy.
       }

在vcl_recv上,一般要用

    setreq.backend = DIRECTOR

說明:如果沒有出現輪詢,說明是在緩存中響應,可以使用如下方法不記錄緩存

if (req.url ~ "/index.html") {   #可以對指定目錄設置不記錄緩存
 return(pass);
}

11、varnish的線程模型:

cache-worker線程:緩存線程

cache-main線程:主線程此線程只有一個,用於啓動caceh

ban luker:緩存清理

acceptor:接收用戶請求

epoll:線程池管理器

expire:清理過期緩存

 

varnish定義其最大併發連接數:線程池模型:

    thread_pools:線程池個數;默認爲2;

    thread_pool_max:單線程池內允許啓動的最多線程個數;

    thread_pool_min:單線程池內允許啓動的最少線程個數;

    thread_pool_timeout:多於thread_pool_min的線程空閒此參數指定的時長後即被purge;

 

varnish的param查看及改變:

    param.show[-l] [param]

    param.set[param] [value]

 

varnishtop: 內存日誌區域查看工具

        一次訪問查看如下所示:

clip_image016

查看到的日誌:

RxHeader  User-Agent: Mozilla/5.0 (WindowsNT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81Safari/537.36  

其中:

        RxHeader:稱爲tag, 基於tag過濾,可使用-i或-x選項;

        User-Agent起始的內容:稱爲日誌信息,可使用-I或-X選項進行過濾;

 

        -Iregexp: 僅顯示被模式匹配到的條目

        -Xregexp:僅顯示不被模式匹配到的條目

        -C:忽略字符大小寫;

        -d:顯示已有日誌;

 

    varnishstat:varnish緩存的統計數據

        -ffield, field, ...  #查看指定字段

        -l:列出所有可用字段

        -x:xml輸出格式

        -j:json輸出格式

 

    varnishlog,varnishncsa

varnishlog一次顯示如下所示:

clip_image018

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