如何让varnish支持虚拟主机:
if (req.http.host = "www.nihao.com") {
}
强制对某资源的请求,不检查缓存:
上图表示以/test1.html开头结尾的url直接送给pass engine不查询缓存
if (req.url ~ "(?i)^/login" || req.url ~ "(?i)^/admin") {
return(pass);
}
上面这个语句表示:以/login或者/admin开头的url不查询缓存,(?i)表示后面跟的字符不区分大小写
对特定类型的资源取消其私有的cookie标识,并强行设定其在varnish服务器中缓存的时长
sub 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;
}
}
上面是一个例子,注意它是设置在varnish中缓存的时长,而不是在浏览器中所看到的缓存时长,只要客户端请求首部中不包含
no-cache首部,此缓存将直接响应给客户端,如果请求包含了no-cache,跳过代理缓存服务器,直接向原始服务器发送请求
对后端服务器(backend)的定义
backend name {
.attribute = "value";
}
.attribute可以是以下内容:
.host: BE主机的IP
.port:BE主机监听的PORT
.probe: 对BE做健康状态检测
.max_connections:并发连接最大数量
.url: 判定BE健康与否要请求的url
.expected_response:期望响应状态码;默认为200
上图是一个对后端主机的的动静分离示例,probe是通过对后端主机请求url进行健康状态检测
对后端主机的调用是通过set req.backend_hint命令
上图是对后端服务器负载均衡的一个示例,注意varnish对后端的负载均衡的方法是对后端同一个网页的请求会被分配到同一台服务
器,而不是每次对一个资源的请求被负载均衡到不同的服务器
负载均衡算法:
fallback, random, round_robin, hash
purge用于清理缓存中的某特定对象及其变种(variants),因此,在有着明确要修剪的缓存对象时可以使用此种方式。HTTP协议的
PURGE方法可以实现purge功能,不过,其仅能用于vcl_hit和vcl_miss中,它会释放内存工作并移除指定缓存对象的所有Vary:-变
种,并等待下一个针对此内容的客户端请求到达时刷新此内容。另外,其一般要与return(restart)一起使用。下面是个在VCL中配置的
示例
acl purgers {
"127.0.0.1";
"192.168.0.0"/24;
}
sub vcl_recv {
if (req.request == "PURGE") {
if (!client.ip ~ purgers) {
error 405 "Method not allowed";
}
return (lookup);
}
}
sub vcl_hit {
if (req.request == "PURGE") {
purge;
error 200 "Purged";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
purge;
error 404 "Not in cache";
}
}
sub vcl_pass {
if (req.request == "PURGE") {
error 502 "PURGE on a passed object";
}
}
客户端在发起HTTP请求时,只需要为所请求的URL使用PURGE方法即可,其命令使用方式如下:
# curl -I -X PURGE http://varniship/path/to/someurl