Varnish缓存代理服务器简介及主要特性(2)

Varnish无法追踪某缓存对象是否存入了缓存文件,也就无从得知磁盘上的缓存文件是否可用,因此file存储方法在varnish停止或重启时会清除数据;而persistent方法的出现对此有了一个弥补,但persistent仍处于测试阶段,其仅适用于有着巨大缓存空间的场景。

选择使用合适的存储方式有助于提升系统性。从经验的角度来看,建议在内存空间足以存储所有的缓存对象时使用malloc的方法,而file存储有着更好的性能表现。需要注意的是,varnishd实际上使用的空间比使用-s选项指定的缓存空间更大,一般说来,其需要为每个缓存对象多使用差不多1K左右的存储空间,这意味着,对于100万个缓存对象的场景来说,其使用的缓存空间将超出指定大小1G左右。另外,为了保存数据结构等,varnish自身也会占去不小的内存空间。

为varnishd指定使用的缓存类型时,-s 选项可接受的参数格式如下:

malloc [size] 或 file [path [size [granularity]]] 或 persistent path size {experimental}

VCL内置函数

vcl_recv函数:用于接收和处理请求。当请求到达并成功接收后被调用,通过判断请求的数据来决定如何处理请求。此函数一般以如下几个关键字结束:

pass:进入pass模式,把请求控制权交给vcl_pass函数;

pipe:进入pipe模式,把请求控制权交给vcl_pipe函数;

error code [reason]:返回code给客户端并放弃处理该请求;code是错误标识,例如200、405等;reason是错误提示信息。

vcl_pipe函数:此函数在进入pipe模式时被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不变的内容返回给客户端,直到这个链接关闭。此函数一般以如下几个关键字结束:

error code [reason]

pipe

vcl_pass函数:此函数在进入pass模式时被调用,用于将请求直接传递至后端主机,后端主机应答数据后送给客户端,但不进行任何缓存,在当前连接下每次都返回最新的内容。此函数一般以如下几个关键字结束:

error code [reason]

pass

vcl_hash:表示在缓存里查找被请求的对象,并且根据查找的结果把控制权交给函数vcl_hit或者函数vcl_miss

vcl_hit函数:在执行vcl_hash后,如果在缓存中找到请求的内容,将自动调用该函数。此函数一般以如下几个关键字结束:

deliver:表示将找到的内容发送给客户端,并把控制权交给函数vcl_deliver

error code [reason]

pass

vcl_miss函数:在执行val_hash后,如果没有在缓存中找到请求的内容时自动调用该方法,此函数可以用于判断是否需要从后端服务器取内容。此函数一般以如下几个关键字结束:

fetch:表示从后端获取请求的内容,并把控制权交给vcl_fetch函数

error code [reason]

pass

vcl_fetch函数:在从后端主机更新缓存并且获取内容后调用该方法,接着,通过判断获取的内容来决定是否将内容放入缓存,还是直接返回给客户端。此函数一般以如下几个关键字结束:

error code [reason]

pass

deliver

vcl_deliver函数:在缓存中找到请求的内容后,发送给客户端前调用此方法。此函数一般以如下几个关键字结束:

error code [reason]

deliver

vcl_timeout函数:此函数在缓存内容到期前调用。一般以如下几个关键字结束:

discard:表示从缓存中清除该内容。

fetch

vcl_discard函数:在缓存内容到期后或缓存空间不够时,自动调用该方法。此函数一般以如下几个关键字结束:

keep:表示将内容继续保留在缓存中

discard

以下是VCL处理流程图,通过下图可以更清楚Varnish的工作过程:

Varnish缓存代理服务器简介及主要特性

Varnish处理 HTTP请求 的过程分为以下几个步骤:

Receive状态,也就是请求处理的入口状态,根据VCL规则判断该请求应该Pass或Pipe,或者进入Lookup(本地查询);

PIPE状态,不可缓存数据,直接管道后端处理;

Lookup状态,进入此状态后,会在hash表中查找数据,若找到,则进入Hit状态,否则进入miss状态;

Pass状态,在此状态下,会进入后端请求,即进入Fetch状态;

Fetch状态,在Fetch状态下,对请求进行后端获取,发送请求,获得数据,并进行本地存储;

Deliver状态,将获取到的数据发送给客户端,然后完成本次请求。

VCL内置公用变量

当请求到达后,可以使用的公用变量如下所示:

req.backend:指定对应的后端主机

server.ip:表示服务器端IP

client.ip:表示客户端IP

req.request:指定请求的类型,例如GET、HEAD、POST等

req.url:指定请求的地址

req.proto:表示客户端发起请求的HTTP协议版本

req.http.header:表示对应请求中的http头部信息

req.restarts:表示请求重启的次数,默认最大值为4

Varnish 在向后端主机请求时,可以使用的公用变量如下所示:

beresp.request:指定请求的类型,例如GET、HEAD等

beresp.url:指定请求的地址

beresp.proto:表示客户端发起请求的HTTP协议版本

beresp.http.header:表示对应请求中的http头部信息

beresp.ttl:表示缓存的生存周期,也就是cache保留多长时间,单位是秒

从cache或者后端主机获取内容后,可以使用的公用变量如下所示:

obj.status:返回内容的请求状态代码,例如200、302、504等

obj.cacheable:返回的内容是否可以缓存,也就是说,如果HTTP返回是200、203、300、301、302、404、410等,并且有非0的生存期,则可以缓存

obj.valid:表示是否是有效的HTTP应答

obj.response:返回内容的请求状态信息

obj.proto:返回内容的HTTP协议版本

obj.ttl:返回内容的生存周期,也就是缓存时间,单位是秒

obj.lastuse:返回上一次请求到现在的间隔时间,单位是秒

对客户端应答时,可以使用的公用变量如下所示:

resp.status:返回客户端的HTTP状态代码

resp.proto:返回客户端的HTTP协议版本

resp.http.header:返回客户端的HTTP头部信息

resp.response:返回客户端的HTTP状态信息

  如果想要了解更多请查阅Varnish官方文档 查看文档

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

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