码迷,mamicode.com
首页 > 其他好文 > 详细

vainish详解

时间:2016-05-25 22:36:07      阅读:357      评论:0      收藏:0      [点我收藏+]

标签:varnish

    

  在互联网时代,站在使用者的角度来看一个网站是否成功与否,就是以网站的响应速度来衡量的,响应速度每慢一秒就会损失大量的用户。而作为后端提供服务的公司,要如何解决此类问题也也越来越迫切。

  缓存(cache)就是能够解决此类问题的一种行之有效方法,它主要是把网站中的大量的静态资源放在缓存中,当有用户需要访问静态资源时,不需要到web服务器上去请求,而直接把缓存中的静态资源响应给用户,节省了大量的时间。

  varnish就是一款开源的HTTP缓存服务,它提供了强大的缓存功能,接下来我们就对varnish做一个全面的解析


 varnish是一个轻量级的Cache和反向代理软件,varnish主要有以下几个特性:

 1、基于内存进行缓存,重启后数据将消失(也可基于文件进行缓存)

 2、能够精确的设置缓存时长

 3、具有强大的缓存管理功能

 4、可以根据导入Director模块,实现负载均衡。


 varnish的架构

 技术分享   主要分为二个部分,结构类似master/worker类型

   1、management:管理进程,主要负责子进程管理,初始化。

   2、child:工作进程,主要负责存储cache,记录日志,接受客户端请求,与后端联系,管理线程


varnish的工作流程:

技术分享  

   工作流程为:

    主要分为三种情况:

    不需要检查缓存:

      1、客户端发送请求

      2、接受请求后直接发往后端主机,然后取得资源回应客户端

    需要检查缓存但每命中

      1、客户端发送请求

      2、服务端接受请求发往vcl_hash,检查缓存,没有命中

      3、发往后端主机并取得资源,响应客户端

    需要检查缓存并且命中

      1、客户端发送请求,

      2、服务端接受请求发往vcl_hash,检查缓存,命中

      3、直接把缓存结果响应给用户


   

   

技术分享



  varnish的配置使用

  Vanish的配置语言:

  Varnish的所有配置都是通过VCL(varnish configure language)来配置的。它是一种基于“域”(domain specific)的简单编程语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达式进行字符串匹配、允许用户使用set自定义变量、支持if判断语句,也有内置的函数和变量等。使用VCL编写的缓存策略通常保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用。事实上,整个缓存策略就是由几个特定的子例程如vcl_recv、vcl_fetch等组成,它们分别在不同的位置(或时间)执行,如果没有事先为某个位置自定义子例程,varnish将会执行默认定义的代码,这些代码就是default.vcl中被注释的代码。
   VCL策略在启用前,会由management进程将其转换为C代码,而后再由gcc编译器将C代码编译成二进制程序。编译完成后,management负责将其连接至varnish实例,即child进程。正是由于编译工作在child进程之外完成,它避免了装载错误格式VCL的风险。因此,varnish修改配置的开销非常小,其可以同时保有几份尚在引用的旧版本配置,也能够让新的配置即刻生效。编译后的旧版本配置通常在varnish重启时才会被丢弃,如果需要手动清理,则可以使用varnishadm的vcl.discard命令完成

  VCL语法

    (1) //, #,/*...*/:注释

    (2) sub $name:定义子例程;

(3) 不支持循环,支持条件判断;

    (4) 有内建变量;

(5) 使用终止语句return,没有返回值; 

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

  vanish的内置函数

    (1)、vcl_recv函数
    用于接收用户请求,当成功接收用户请求后被调用。通过某种动作来决定如何处理请求。
该函数有如下执行动作:
    pass:表示请求不再本地缓存中查找,且进入pass模式,并将处理请求控制权交给vcl_pass函数
    pipe:表示请求不再本地缓存中查找,且进入pipe模式,并将请求控制权交给vcl_pipe函数。此模式下不会对客户端做任何的检查或操作,而是在客户端和后端服务器直接建立管道,并将数据直接在这个管道中传输。此时,keep-alive连接中后续的数据也会通过管道进行传输,并且不会出现在任何日志中。
    error code [reason]:返回错误代码给客户端并丢弃该请求。Code表示错误代码,如404,405等等。Reason表示错误提示信息。
    lookup:表示在缓存中查找请求的对象。并根据查找的结果将请求控制权交给vcl_hit或vcl_miss函数。
 
    (2)、pipe函数
    在进入pipe模式时该函数被调用,用于将客户端请求直接传递给后端服务器,在请求和返回的内容没有改变的情况下,将不变的内容直接返回给客户端。直到这个连接关闭。
该函数具有如下执行动作:
    error code reason:返回错误代码并丢弃该请求

 
    (3)、vcl_pass函数
    当vcl_recv函数执行pass动作进入pass模式时该函数被调用,用于将客户端请求直接转发给后端服务器,后端服务器响应给客户端时,不进行缓存。由于直接将请求转发给后端服务器,因此该连接下的响应数据都是最新的。
该函数具有如下执行动作:
    error code  reason:返回错误代码并丢弃该请求
    pass:表示从后端服务器获取数据,并将请求控制权交给vcl_fetch函数
    restart:重启整个vcl,并且该请求重新进行检查。即该请求重新接受vcl_recv函数的检查。执行restart动作后,会计算重启计数,当超过max_restarts最大重启计数会返回错误信息
 
 
    (4)、vcl_hit函数
    该函数在执行lookup命令后,如果在缓存中找到请求数据,则自动调用该函数。

该函数具有如下执行动作:
    deliver:表示从缓存中找到的数据返回给客户端,并将控制权交给vcl_deliver函数
    pass:进入pass模式,并将控制权交给vcl_fetch。这种模式下,虽然在缓存中找到了数据,但是不使用缓存中的数据,而是从后端服务器获取。
    error code reason:返回错误代码并丢弃该请求
    restart:重启整个vcl,并且该请求重新接受vcl_recv函数的检查。执行restart动作后,会计算重启计数,当超过max_restart最大计数器后会返回错误信息。
 
    (5)、vcl_miss函数
    该函数在执行lookup命令后,如果在缓存中没有找到请求数据,则自动调用该函数
该函数具有如下执行动作:
    Fetch:表示从后端服务器获取请求数据,并叫控制权交给vcl_fetch
    Pass::进入pass模式,并将控制权交给vcl_pass。
    Error code reason:表示返回错误代码和信息并丢弃该请求。
    Restart:重启整个vcl,并且该请求重新接受vcl_recv函数的检查。执行restart动作后,会计算重启计数,当超过max_restart最大计数器后将返回错误信息。
 
 
    (6)、vcl_fetch函数
    当想从后端服务器获取数据或更新缓存时该函数被调用,并且根据某种动作来判断获取的数据是否被缓存,还是直接返回给客户端。
该函数具有如下动作:
    deliver:表示从后端服务器获取到的资源或数据进行缓存。并将控制权交给vcl_deliver函数。
    hit_for_pass:表示从后端服务器获取到的数据或资源不进行缓存,且将控制权交给vcl_deliver函数。并且后续对该对象的请求直接交给vcl_pass函数。
      error code reason:表示返回错误代码和信息并丢弃该请求。
restart:重启整个vcl,并且该请求重新接受vcl_recv函数的检查。执行restart动作后,会计算重启计数,当超过max_restart最大计数器后将返回错误信息。
 
 
    (7)、vcl_deliver函数
    将请求的数据返回给客户端调用此函数。
该函数具有如下执行动作:
    deliver:将请求数据直接返回给客户端
    error code reason
    restart





vainish详解

标签:varnish

原文地址:http://bolly.blog.51cto.com/4460561/1783192

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!