varnish-4.x VCL之强制cache miss
sub vcl_recv {
set req.hash_always_miss = true;
}
在最前面的某段vcl_recv写入 set req.hash_always_miss = true,即启用强制cache miss
这样varnish会把所有的请求都miss掉,直接丢到后端的web server,将最新的内容返回给客户端 并缓存一份最新的副本到varnish本地,注意,仅仅只是缓存,给客户端的永远最最新的内容
注意: 因为缓存多个副本,随着时间的推移,消耗内存也会逐渐增加,调试时可以用到
vcl 4.0;
import std;
import directors;
probe healthcheck_nginx {
.url = "/healthy.jpg";
.timeout = 3s;
.interval = 5s;
.window = 5;
.threshold = 3;
}
probe healthcheck_apache {
.url = "/healthy.jpg";
.timeout = 3s;
.interval = 5s;
.window = 5;
.threshold = 3;
}
backend nginx {
.host = "192.168.192.10";
.port = "8080";
.connect_timeout = 3s;
.first_byte_timeout = 5s;
.between_bytes_timeout = 5s;
.max_connections = 30000;
.probe = healthcheck_nginx;
}
backend apache {
.host = "192.168.192.10";
.port = "8081";
.connect_timeout = 3s;
.first_byte_timeout = 5s;
.between_bytes_timeout = 5s;
.max_connections = 3000;
.probe = healthcheck_apache;
}
sub vcl_init {
new round_robin_director = directors.round_robin();
round_robin_director.add_backend(apache);
round_robin_director.add_backend(nginx);
new random_director = directors.random();
random_director.add_backend(nginx, 10);
random_director.add_backend(apache, 5);
new hash_director = directors.hash();
hash_director.add_backend(nginx, 10);
hash_director.add_backend(apache, 5);
}
sub vcl_recv {
set req.hash_always_miss = true;
}
sub vcl_recv {
if (req.method == "PRI") {
return (synth(405));
}
if (req.method != "GET" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "OPTIONS" &&
req.method != "DELETE") {
return (pipe);
}
if (req.method != "GET" && req.method != "HEAD") {
return (pass);
}
if (req.http.Authorization || req.http.Cookie) {
return (pass);
}
return (hash);
}
acl purgers {
"127.0.0.1";
"192.168.0.0"/24;
}
sub vcl_recv {
# allow PURGE from localhost and 192.168.0...
if (req.restarts == 0) {
unset req.http.X-Purger;
}
if (req.method == "PURGE") {
if (!client.ip ~ purgers) {
return (synth(405, "Purging not allowed for " + client.ip));
}
return (purge);
}
#set req.backend_hint = round_robin_director.backend();
set req.backend_hint = hash_director.backend(req.http.cookie);
}
sub vcl_purge {
set req.method = "GET";
set req.http.X-Purger = "Purged";
return (restart);
}
sub vcl_deliver {
if (req.http.X-Purger) {
set resp.http.X-Purger = req.http.X-Purger;
}
}