标签:varnish
在互联网时代,站在使用者的角度来看一个网站是否成功与否,就是以网站的响应速度来衡量的,响应速度每慢一秒就会损失大量的用户。而作为后端提供服务的公司,要如何解决此类问题也也越来越迫切。
缓存(cache)就是能够解决此类问题的一种行之有效方法,它主要是把网站中的大量的静态资源放在缓存中,当有用户需要访问静态资源时,不需要到web服务器上去请求,而直接把缓存中的静态资源响应给用户,节省了大量的时间。
varnish就是一款开源的HTTP缓存服务,它提供了强大的缓存功能,接下来我们就对varnish做一个全面的解析
varnish是一个轻量级的Cache和反向代理软件,varnish主要有以下几个特性:
1、基于内存进行缓存,重启后数据将消失(也可基于文件进行缓存)
2、能够精确的设置缓存时长
3、具有强大的缓存管理功能
4、可以根据导入Director模块,实现负载均衡。
varnish的架构
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
标签:varnish
原文地址:http://bolly.blog.51cto.com/4460561/1783192