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 的架构笔记

CentOS 5.8下Varnish-2.1.5的安装配置

RedHat脚本改用CentOS源更新安装Nginx、PHP 5.3、Varnish

利用Varnish构建Cache服务器笔记

缓存服务Varnish安装配置

Varnish 编译安装所需准备

Linux下Varnish缓存的配置优化
 
四、Varnish的工作流程图

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

Varnish处理请求流程大致可以分为如下几个步骤:
(1)、首先当请求到达时,接受vcl_recv函数的检查,在这个函数中,可以执行pass、pipe、lookup、error操作。
(2)如果在vcl_recv函数执行lookup操作,则会在缓存中查看是否有该缓存对象。如果有,则表示缓存命中,则在接受vcl_hit函数的检查。在该函数下可以将缓存对象直接返回给客户端,即执行deliver操作。也可以不使用本地缓存对象,从后端服务器获取请求对象,即执行pass操作。如果本地没有该缓存对象,则表示缓存丢失,则会接受vcl_miss函数检查。该函数会从后端服务器获取最新资源,即将会执行pass或fetch操作。
(3)如果在vcl_recv函数执行pass操作,则表示不再本地缓存查找,直接从后端服务器进行获取,即将会接受vcl_pass函数的检查。
(4)如果在vcl_recv函数处执行pipe操作,则表示不再本地缓存中查找,并且客户端和后端服务器建立管道,后续客户端的keep-alive连接中的请求数据传输将在管道中进行,并且请求数据接受vcl_pipe函数的检查。直到数据传输完成时关闭该管道连接。
(5)当需要从后端服务器获取资源或数据时,需要调用vcl_fetch函数,并且根据某种条件判断该数据或资源是否缓存在本地,即执行deliver操作;或者直接将该资源返回给客户端,不缓存在本地,即执行hit_for_pass操作
最后,不管是从本地缓存中响应的数据还是从后端原始服务器获取到的数据返回给客户端都需要调用vcl_deliver函数来完成。

更多详情见请继续阅读下一页的精彩内容:

  • 1
  • 2
  • 下一页

相关内容