vcl工作流程


vcl状态引擎
state engine 多引擎之间存在相关性,前一个engine如果有多个下游engine,则上游需要用return 指明要转移的engine
vcl_recv
vcl_hash
vcl_hit
vcl_miss
vcl_fetch
vcl_deliver
vcl_pass
vcl_error
编程语法
(1)支持注释 // # /* */
(2)不支持循环
(3)sub $name:用于定义子例程
sub vcl_recv {
}
(4)有众多内置的变量,变量的可调用位置与state engine有密切相关性
(5)支持终止语句,return(action),没有返回值
(6)"域"专用
(7)操作符 =,==,!,&&,||
pipe 无法理解请求方法,管道直接送到后台
pass 不查缓存
常用语句
if else
set name=value
unset name
req.http.HEADER:调用请求报文中http协议的指定的变量
req.request:请求方法
状态引擎流程(V3)
vcl_recv-->vcl_hash-->vcl_hit-->vcl_deliver
vcl_recv-->vcl_hash-->vcl_miss-->vcl_fetch-->vcl_deliver
vcl_recv-->vcl_pass-->vcl_fetch-->vcl_deliver
vcl_recv-->vcl_pipe

状态引擎流程(V4)
image.png
varnish 变量种类
req 请求
resp 响应
client 客户端
server 服务端
bereq 向后端请求时产生的req
beresp 后端响应时产生的resp
obj
storage
常用变量
bereq
bereq.http.HEADERS: 由varnish发往backend server的请求报文的指定首部;
bereq.request:请求方法;
bereq.url:
bereq.proto:
bereq.backend:指明要调用的后端主机;
beresp
beresp.proto
beresp.status:后端服务器的响应的状态码
beresp.reason:原因短语;
beresp.backend.ip
beresp.backend.name
beresp.http.HEADER: 从backend server响应的报文的首部;
beresp.ttl:后端服务器响应的内容的余下的生存时长;
obj
obj.ttl: 对象的ttl值;
obj.hits:此对象从缓存中命中的次数;
server
server.ip
server.hostname
req
resp
官方文档:https://www.varnish-cache.org/docs/4.0/reference/vcl.html#varnish-configuration-language
支持虚拟主机:
if (req.http.host == "www.magedu.com") {
}
强制对某资源的请求,不检查缓存;
/admin
/login
if (req.url ~ "(?i)^/login" || req.url ~ "(?i)^/admin") {
return(pass);
}
对特定类型的资源取消其私有的cookie标识,并强行设定其可以varnish缓存的时长:
vcl_backend_response
if (beresp.http.cache-control !~ "s-maxage") {
if (bereq.url ~ "(?i)\.jpg$") {
set beresp.ttl = 3600s;
unset beresp.http.Set-Cookie;
}
if (bereq.url ~ "(?i)\.css$") {
set beresp.ttl = 600s;
unset beresp.http.Set-Cookie;
}
}
官方配置示例:https://www.varnish-cache.org/trac/wiki/VCLExamples
backend server的定义:
backend name {
.attribute = "value";
}
.host: BE主机的IP;
.port:BE主机监听的PORT;
.probe: 对BE做健康状态检测;
.max_connections:并连接最大数量;
后端主机的健康状态检测方式:
probe name {
.attribute = "value";
}
.url: 判定BE健康与否要请求的url;
.expected_response:期望响应状态码;默认为200;
网友评论