Varnish脚本对于vcl来说似乎相当强大,但我还不知道如何让它做我需要的东西。我从相同的代码库运行各种站点,我想要大多数目录的统一清漆缓存,所以
x.mysite.org/theme/something.gif和y.mysite.org/theme/something.gif不应该在varnish cache中存储同一个gif的两个副本
然而
x.mysite.org/file.php/1和y.mysite.org/file.php/1应该有基于网址的单独缓存。
另外,mysite.org是一个拥有自己缓存的整个其他网站。
我目前的方向如下
sub vcl_fetch {
if (req.url ~ ".*\.org/file\.php") {
# do normal site specific caching
} elseif (req.url ~ "^+?\.mysite.org") {
# cache all found material in a base directory so everyone knows where to look
set req.url = regsub(req.url, "(.*\.org)(.*)", "base.mysite.org\2");
} else {
# do normal site specific caching for base site
}
}
sub vcl_recv {
# do I need to do something here to look in base.mysite.org
}
如果有必要,我可以将base.mysite.org设置为一个真正的apache服务站点,这样如果没有缓存,请求就会失败。
我是写作路径上的任何帮助。
答案 0 :(得分:1)
您应该将req.http.host
标准化而不是req.url
,因此
sub vcl_fetch {
# if it starts with /theme or /static, or contains .gif,.png etc,
# then consider the host to the normalized/common host
if (req.url ~ "^/(theme|static)" || req.url ~ "\.(gif|png)" ) {
set req.http.host = "base.mysite.org";
return (lookup);
}
# else, do non shared stuff here
}
答案 1 :(得分:0)
默认情况下,Varnish将使用主机名+ URL来获取缓存对象的哈希值。这意味着即使x.mysite.org/theme/something.gif和y.mysite.org/theme/something.gif指向完全相同的内容,Varnish也会将它们视为两个不同的缓存对象。让它们指向同一个缓存对象的唯一方法是将主机名规范化,就像Ivy在帖子中解释的那样。
'希望有所帮助。