VCL 子程序

一个子程序就是一串可读和可用的代码,子程序在VCL中没有参数,也没有返回值。示例如下:
sub pipe_if_local {
if (client.ip ~ local) {
pipe;
}

}

调用一个子程序,使用子程序的关键字名字,如下所示:call pipe_if_local;
有很多默认子程序和varnish的工作流程相关,这些子程序会检查和操作http头文件和各种各样的请求,决定哪个、哪些请求被使用,如果这些子程序没有被定义,或者没有完成预定的处理而被终止,控制权将被转交给系统默认的子程序。它们是:
1:vcl_init
当VCL加载时调用,之后加载客户请求。一般用于初始化VMOD模块。
返回值有:ok
表示正常返回值,返回OK后VCL加载。

Varnish流程



Actions,VCL中主要有如下动作:
pass:当一个请求被pass后,这个请求将通过varnish转发到后端服务器,该请求不会被缓存,后续的请求仍然通过Varnish处理。pass可以放在vcl_recv 和vcl_fetch中。
lookup:当一个请求在vcl_recv中被lookup后,varnish将从缓存中提取数据,如果缓存中没有数据,将被设置为pass,不能在vcl_fetch中设置lookup。
pipe:pipe和pass相似,都要访问后端服务器,不过当进入pipe模式后,在此连接未关闭前,后续的所有请求都直接发到后端服务器,不经过Varnish的处理。
deliver:请求的目标被缓存,然后发送给客户端
hit_for_pass:表示直接从后台获取数据,会创建一个hit_for_pass的对象,该对象的TTL值将会被设置成beresp.ttl的当前值。用来控制vcl_deliver如何处理当前的请求,后续的请求会直接vcl_pass,可在vcl_fetch中用
fetch:从后端服务器获取请求目标,控制权转交给vcl_fetch。
hash:进入Hash模式
restart:重启本次事务,重新返回给vcl_recv,如果重启次数超过了max_restarts报错
ok:表示正常
error:表示错误

在VCL中,有3个重要的数据结构:
req:请求目标,当varnish接收到一个请求,这时req object就被创建了,在vcl_recv中的大部分工作,都是在req object上展开的。
beresp:后端服务器返回的目标,它包含返回的头信息,在vcl_fetch中的大部分工作都是在beresp object上开展的。
obj:被cache的目标,只读的目标被保存于内存中,obj.ttl的值可修改,其他的只能读。


2:vcl_recv
在请求的开始被调用,在接收、解析后,决定是否响应请求,怎么响应,使用哪个后台服务器。在vcl_recv中,可以修改请求,比如可以修改cookies,添加或者删除请求的头信息。注意vcl_recv中只有请求的目标。vcl_recv子程序以下面的关键字结束:error code [reason] 、pass、pipe、lookup
3:vcl_pipe
请求进入pipe模式的时候被调用,在这个模式,请求会被passed到后端服务器,在连接关闭前,无论是这个客户端还是对应的后端服务器的数据,都会进入pass模式。vcl_pipe子程序以下面的关键字结束:error code [reason]、pipe
4:vcl_pass
请求进入pass模式的时候被调用,在这个模式,请求会被passed到后端服务器,后端服务器的应答会被passed给客户端,但是不会被缓存。相同客户端的随后的请求正常处理。vcl_pass子程序以下面的关键字结束:error code [reason]、pass、restart
5:vcl_hash
使用req.hash += req.http.Cookie 或者HTTP头文件包含的cookie生成hash字符串。vcl_hash将以下面的关键字结束hash
6:vcl_hit
当一个请求从cache中命中需要的内容,vcl_hit子程序以下面关键字结束:error code [reason]、pass、deliver、restart
7:vcl_miss
当需要的内容没有在缓存中命中的时候被调用,决定是否尝试到后端服务器查找目标,从哪个后端服务器查找目标,vcl_miss子程序以下面的关键字结束:error code[reason] 、pass、fetch
8:vcl_fetch
在一个文件成功从后台获取后被调用,通常他的任务就是改变response headers,触发ESI进程,在请求失败的时候轮询其他服务器。在vcl_fetch中一样的包含请求的对象,还有返回对象beresp,它将会包含后端服务器的返回信息。以下面的关键字结束:error code [reason]、 hit_for_pass、deliver、restart
9:vcl_deliver
当一个没有被cached内容交付给客户端的时候被调用,vcl_deliver子程序以下面关键字结束:deliver、restart
10:vcl_error
当hit错误或者是发生内部错误的时候。以下面关键字结束: deliver、restart
11:vcl_fini
当销毁VCL程序的时候调用,return值:ok表示正常销毁VCL程序

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值