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

你可能感兴趣的:(VCL)