如何编写清漆脚本来做一些非常特别的事情

时间:2012-01-05 23:20:55

标签: varnish varnish-vcl

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服务站点,这样如果没有缓存,请求就会失败。

我是写作路径上的任何帮助。

2 个答案:

答案 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在帖子中解释的那样。

'希望有所帮助。