varnish原理及配置事例

Varnish是一款高性能的开源HTTP加速器(其实就是带缓存的反向代理服务),可以把http响应内容缓存到内存或文件中,从而提高web服务器响应速度。与传统的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等诸多优点,很多大型的网站都开始尝试使用 varnish 来替换 squid,这些都促进 varnish 迅速发展起来

Varnish程序结构

wKiom1WdOjjQ8WCbAAFUjsrr5iY407.jpg

clip_image002

管理进程:编译VCL并应用新配置、监控varnish、初始化varnish,并提供一个CLI,初始化缓存的内存结构,对缓存内存结构实现分成各个类型大小的内存块。

Child/Cache线程有几类:

    Acceptor:接收新的连接请求;

    Worker:用于处理并响应用户请求;

    Expiry:从缓存中清理过期cache object

 

日志:Shared Memory Log,  共享内存内存日志大小一般90MB;分为两部分:前一部分为计数器、后一部分为客户请求相关的数据。

对varnish内的缓存数据的有效管理:

                Expires:定义一个缓存时长,过了缓存时长就认为缓存失效。

                http validation

If-Modified-Since/Last Modified : 每次客户端请求缓存内容,varnish会向后端主机询问这个缓存对象自它缓存的时间开始时有没有改变,没改变的话会返回一个304,证明可以返回varnish内的缓存内容,如果改变了,需要向后端请求该内容返回给客户端。

                        If-None-Match/Etag:会对varnish的缓存内容一个标签和一个缓存时间,过了这个时间,向后端主机询问这个缓存内容的标签是否有改变,没改变的话这个缓存内容增加其缓存时间。


Vcl内置函数和处理流程(状态引擎)

wKiom1WdOjrS1nfvAAHj5JDxUZ4356.jpg

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) 操作符: =, ==, ~, !, &&, ||

 

wKiom1WdOjrS1nfvAAHj5JDxUZ4356.jpg

            

常用变量:

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

变量在各状态引擎使用情况:

wKiom1WdOkLQKbelAAF0SUqSJgU337.jpg

varnish配置实例:

/etc/sysconfig/varnish 是定义varnish运行特性的配置文件;

/etc/varnish/default.vcl 是定义varnish的默认状态引擎的工作配置文件(使用vcl语言定义)

(1)定义varnish后端多主机的实例:

        backend bs1 {

        .host = "www2.bwei.com";

        .port = "80";

}

 

 

backend bs2 {

        .host = "www3.bwei.com";

        .port = "80";

}

 

director bs random {

{ .backend = bs1; .weight=1; }

{ .backend = bs2; .weight=2; }

}

 

sub vcl_recv {

        if (req.url ~ "index.html"){

        set req.backend = bs;

}

}

这里的director是实现调度器的角色,实现把两个后端server合在一起,配置他们的权值及后端server的调度方式,这里有一重点,我们定义了后端server要在vcl_recv这个函数中调用,即定义那个资源要调配到那个后端server上。

(2)实现给客户端的响应报文中,增加一个首部,给用户看是否缓存命中。

sub vcl_deliver{

            if (obj.hit >0){

            set resp.http.X-cache = "hit via"+" "+server.hostname;

}else{

            set resp.http.X-cache = "miss via"+" "+server.hostname;

}

}

(3)实现让某些主机可以删除varnish主机上的缓存:

acl purgers {

                127.0.0.1;

                192.168.179.0; /24

}

sub vcl_recv{

            if (client.ip !~ purgers && req.request == "PURGE"){

            error 405 "method not allowed";            

}

            return (lookup);

}


sub vcl_hit{

            if (req.request == "PURGE"){

                purge;

                error 200 "cache has purge";

}

}


sub vcl_miss{

            if(req.request == "PURGE"){

            purge;

            error 404 "not in cache";

}

sub vcl_pass{

          if(req.request == "PURGE"){

            error 502 "purge object not allowed in pass"

}

}


实现给varnish解析不了的方法,送到pipe上:

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" ){ return (pipe);

实现让除GET,HEAD,PURGE的方法可以到达hash状态引擎,其余到达pass引擎

if (req.request != "GET" && req.request != "HEAD" && req.request != "PURGE"){

                return (pass);

}

从后端主机获取资源后,设定其缓存时间和不缓存cookie信息

sub vcl_fetch{

        set beresp.ttl = 15s;

        if (beresp.http.Set-Cookie){

              return (pass)

}

return (deliver);

}

从后端主机获取资源后,设置那些不能缓存的数据不进行缓存

sub vcl_fetch{

        if(!beresp.cacheable){

            return (pass);

}

        if(beresp.http.Pragma ~"no-cache" ||

            beresp.http.Cache-Control ~ "no-cache" || 

            beresp.http.Cache-Control ~ "private"){

            return (pass);    

}

}

设置客户端请求我们的varnish出现认证和cookie时,把它们直接送去pass引擎

if(req.http.Authorization || req.http.Cookie){

            return (pass);

}

设置对后端主机进行健康状态检查:

probe healthcheck {

        .url = "/health.html";

        .interval = 60s;

        .timeout = 0.3s;

        .window = 8; 

        .threshold = 3;

        .initial = 3;

        .expected_response = 200;

}

backend bs1 {

        .host = "www2.bwei.com";

        .port = "80";

        .probe = healthcheck;

}

 

 

backend bs2 {

        .host = "www3.bwei.com";

        .port = "80";

        .probe = healthcheck;

}

varnish的配置段需要我们对其进行编译才能运行,我们对其每次对其进行改变都需要重新编译和使用:

        varnishadm管理软件可以实现vcl语言编译:vcl.load <name> <filename>(加载vcl配置)

                                                                        vcl.use <name> (使用vcl配置)

原创文章,作者:13-广州-杨过,如若转载,请注明出处:http://www.178linux.com/9551

(1)
13-广州-杨过13-广州-杨过
上一篇 2015-12-06
下一篇 2015-12-06

相关推荐

  • 马哥教育网络22期+第四周作业博客

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。    [root@centos-rpi3 skel]# cp -r /etc/skel /home/tuser1 && chmod -R g-rwx,o-rwx /home/tuser1 …

    Linux干货 2016-09-08
  • 马哥教育网络20期+第五周课程练习

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; [root@localhost ~]# grep "^[[:space:]]\+" /boot/grub/grub.conf 2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又…

    Linux干货 2016-07-07
  • CentOS6.7下关于vsftpd的应用之一(匿名用户/普通用户/虚拟用户)

    1)使用yum安装vsftpd [root@C67-X64-A1 ~]# /etc/init.d/vsftpd start为 vsftpd 启动 vsftpd:           &nbs…

    Linux干货 2016-09-19
  • HA专题: corosync+pacemaker实现nginx高可用

    HA专题: corosync+pacemaker实现nginx高可用 前言 实验介绍 实验拓扑 实验环境 实验步骤 准备工作 安装HA集群组件 安装nginx和配置nfs 使用crmsh配置集群资源 测试 总结 前言 这几天都会学习高可用集群, 也会将其中的一些实验写出来分享给大家, 这个专题估计会写5篇左右, p.s: 写博客很累的 实验介绍 这次的实验比…

    Linux干货 2016-04-11
  • 系统基础之权限管理作业题

    1.问题:  在/data/testdir里创建的新文件自动属于g1组,组g2的成员如: alice能对这些新文件有读写权限,组g3的成员如:tom只能对新文件有读权限,其它用户(不属于g1,g2,g3)不能访问这个文件夹。 [root@wen-7 testdir]# mkdir -p /data/…

    Linux干货 2016-08-04
  • 游戏运维工程师

    爱乐盟互动为深圳市政府评定的深圳市重点文化企业,同时为广东省高科技产业商会常务理事单位,注册资金人民币1000万元。公司的原创大型MMORPG网游《王者传说2》为深圳市政府重点支持的网游项目,《王者传说2》将全面领先于国内的同类产品,成为业界新标准的重要网游产品!! 《王者传说2》已进入产品研发的重要阶段。除《王者传说2》,爱乐盟也已经启动了数款全新大型网游…

    Linux干货 2016-10-19

评论列表(1条)

  • stanley
    stanley 2015-12-06 20:32

    图很专业,代码如何能格式化配合一定样式就是精品了