Varnish的配置语言VCL及其内置变量介绍

一、Varnish的配置语言VCL
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语法
VCL的设计参考了C和Perl语言,因此,对有着C或Perl编程经验者来说,其非常易于理解。其基本语法说明如下:
(1)//、#或/* comment */用于注释
(2)sub $name 定义函数
(3)不支持循环,有内置变量
(4)使用终止语句(return)将控制权返回给varnish,没有返回值
(5)域专用
(6)操作符:=(赋值)、==(等值比较)、~(模式匹配)、!(取反)、&&(逻辑与)、||(逻辑或)
 
VCL的函数不接受参数并且没有返回值,因此,其并非真正意义上的函数,这也限定了VCL内部的数据传递只能隐藏在HTTP首部内部进行。VCL的return语句用于将控制权从VCL状态引擎返回给Varnish,而非默认函数,这就是为什么VCL只有终止语句而没有返回值的原因。同时,对于每个“域”来说,可以定义一个或多个终止语句,以告诉Varnish下一步采取何种操作,如查询缓存或不查询缓存等。
 
三、Varnish的内置函数
(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:返回错误代码并丢弃该请求
pipe:
 
(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
 
(8)、vcl_timeout函数
在缓存内容到期前调用此函数,该函数有如下执行动作:
discard:表示从缓存中清除
fetch:表示从后端服务器获取资源进行更新
 
(9)、vcl_discard函数
在缓存内容到期后调用此函数,该函数具有如下执行动作:
Keep:表示过期缓存对象仍然保留在缓存中。
Discard:表示从缓存中清除

缓存服务器Varnish概念篇

缓存服务器Varnish概念篇

Varnish Cache 的架构笔记

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/fd17d90a1595847dd008e41ccb9d979c.html