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 使用3台Varnish代替了原来的12台Squid,性能比以前更好。

官方地址:

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

2、Varnish程序结构

管理进程:编译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状态转换图:

每个请求都被单独处理,处理过程中将处在不同的状态。退出一种状态就会转入下一个状态。状态之间是有关联的,而不是孤立的,下面的图中可以清楚的看出状态的转换,以及不同状态所要经过的处理函数。

官方原图:

自己手绘的中文版(不求准确,但求理解)

常用变量:

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:调用响应报文状态码

各类报文使用位置和使用权限:

4、配置拓扑和环境说明:


主机名


Ip地址


功能描述


Varnish


172.16.4.100


接收用户访问,并且将请求转发到后端web服务,最后将请求结果缓存


Web-01


172.16.4.101


提供web服务


Web-02


172.16.4.102


提供web服务

所有服务器系统环境如下:

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

Web服务器已经配置好服务,并且varnish服务器可以访问,结果如下配置过程略:

[[email protected] ~]# curl 172.16.4.101
web-01
[[email protected] ~]# 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/

[[email protected] ~]# 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
[[email protected] ~]# 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

[[email protected] ~]# 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

[[email protected] ~]# 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监听即可

[[email protected] ~]# service varnish start
[[email protected] ~]# 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表示缓存成功

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,并且列出常用参数

[[email protected] ~]# 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

验证:是否可以手动移除单个缓存

[[email protected] ~]# 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               #正常访问缓存是命中的
[[email protected] ~]# 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客户端访问如下所示:

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: 内存日志区域查看工具

一次访问查看如下所示:

查看到的日志:

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一次显示如下所示:

时间: 2024-11-07 12:39:09

vcl状态引擎介绍,varnish安装配置的相关文章

Memcache与Memcached介绍及安装配置

Memcache学习总结1-Memcache与Memcached介绍及安装配置 也许大家一看到Memcache和Memcached会有点晕,这两者有什么关系又有什么区别呢,下面先给大家说下Memcached,Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度. 想必大家也听说过Memcached,就是一个缓存系统,我们可以把一些经常要查询的数据放到缓存中,避免每次要使用

详细图解 Flume介绍、安装配置

写在前面一: 本文总结"Hadoop生态系统"中的其中一员--Apache Flume 写在前面二: 所用软件说明: 一.什么是Apache Flume 官网:Flume is a distributed, reliable, and availableservicefor efficientlycollecting, aggregating, and moving large amounts of log data. It has a simple and flexible arch

Zabbix介绍、安装配置

Zabbix介绍.安装配置 本篇文章转自我的个人博客, http://anyisalin.com,欢迎大家访问 我们为什么需要监控? 没有监控就将系统上线, 就是在耍流氓; 在生产环境中, 监控是必不可少的, 因为我们需要实时了解业务的运行状态, 并且将数据以图表的方式直观的展示出来, 甚至当服务出现故障还可以根据事先定义好的规则自动执行相应脚本, 从而实现自动恢复.转移等功能 常用的开源监控系统有哪些? 运维工作就是大部分时候都是通过各种工具来让我们完成特定的任务, 监控也是如此, 目前也有很

每天收获一点点------Hadoop基本介绍与安装配置

一.Hadoop的发展历史 说到Hadoop的起源,不得不说到一个传奇的IT公司—全球IT技术的引领者Google.Google(自称)为云计算概念的提出者,在自身多年的搜索引擎业务中构建了突破性的GFS(Google File System),从此文件系统进入分布式时代.除此之外,Google在GFS上如何快速分析和处理数据方面开创了MapReduce并行计算框架,让以往的高端服务器计算变为廉价的x86集群计算,也让许多互联网公司能够从IOE(IBM小型机.Oracle数据库以及EMC存储)中

MySQL介绍,下载,安装,配置

MySQL用了很多年了,今天写个总结. 一.介绍 MySQL是开源软件,后来归Oracle所有.开源便于软件的完善改进.但开源不等于滥用,也不等于完全免费.MySQL有商业版,商业用途是付费的.也有免费版(社区版),方便软件开发用.一般程序员下载社区免费版. 二.下载 去官网下载安装包.下载安装版 社区版的下载项有很多,有MySQL服务端MySQL Community Server(下载这个),有shell工具,还有Linux上用的yum安装包和suse的安装包.我看到有一个MySQL on W

Nginx介绍及安装配置

Nginx介绍 如果听说过Apache软件那么对于Nginx也会很快就熟悉的和Apache一样nginx是开源的支持高性能高并发的WWW服务.代理服务软件以及电子邮件代理服务器并在一个BSD-like协议下发行由俄罗斯Igor Sysoev所开发开始供俄国大型的入口网址及搜索引擎Rambler使用. nginx占有内存小并发能力强特别是静态资源且功能丰富而流行起来. 从软件的功能应用方面Nginx不但是一个优秀的Web服务软件还可以具有反向代理负载均衡能和缓存服务功能.代理方面类似专业的LVS负

zookeeper介绍以及安装配置

ZooKeeper是什么? 高可用的高性能的分布式系统协调服务.局部不可用是分布式系统的固有特征,ZooKeeper可以很好的地处理这种情况. 下面从三个方面来理解ZooKeeper服务:数据模型.操作.实现 数据模型 可以把zookper看成一个文件系统,文件系统中的所有文件形成一个数状结构,zookeeper维护着这样的树形层次结构,树中的节点称为znode.每个znode有一个与之相关联的ACL(Access Control List).这种数据模型示意图如下: znode通过路径被引用,

Maven介绍与安装配置

Maven介绍: Maven是项目对象模型(POM),是一个项目模块管工具.能很好的管理模块化开发.模块jar包的分享,并且可以自动下载工程所需要的依赖包. 在开发的过程中我们需要一些可重用的代码来加快开发的速度,因为总不可能一些通用的代码每次都需要自己编写吧,那样的话效率很低,或许我们可以将这些类复制到别的开发工具中使用,但是一两个类还好说,如果有几十个类该如何复制,而且用复制这种方式的话代码也容易被修改或删除. 在早期没有Maven的时候,有一种方式是将可重用的代码打包成jar包,然后用导j

Django介绍、安装配置、基本使用、Django用户注册例子

Django介绍 Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站 DjangoMTV的思想 没有controller,把view当成mvc的controller Django安装 可以配合参考:http://blog.csdn.net/jerome_s/article/details/46340079 ( Python介绍.环境搭建.第一个程序) 1. 先安装好Ptyhon 2. 安装Django 下载 :https://www.djangop