Varnish:仅缓存特定域名

15

我已经进行了积极的谷歌搜索,但没有什么收获。

我正在使用Varnish,并取得了不错的成果,但我想在单个服务器(Apache)上托管多个网站,而不让 Varnish 缓存它们所有的内容。

我能否通过URL指定要缓存哪些网站?

谢谢

3个回答

32

(在评论后编辑)它是req.http.host,因此在您的vcl文件(例如default.vcl)中执行以下操作:

sub vcl_recv {
  # dont cache foo.com or bar.com - optional www
   if (req.http.host ~ "(www\.)?(foo|bar)\.com") {
     pass;
   }
  # cache foobar.com - optional www
   if (req.http.host ~ "(www\.)?foobar\.com") {
     lookup;
   }
}

并且在varnish3-vcl中:

sub vcl_recv {
  # dont cache foo.com or bar.com - optional www
   if (req.http.host ~ "(www\.)?(foo|bar)\.com") {
     return(pass);
   }
  # cache foobar.com - optional www
   if (req.http.host ~ "(www\.)?foobar\.com") {
     return(lookup);
   }
}

你是否必须明确传递foo和bar域,或者仅查找所需的域就足够了?换句话说,定义白名单是否足够? - Martijn Heemels
如果您只定义了一个白名单或黑名单(即:您没有在自己的vcl_recv函数中使用像pass、lookup等操作退出),那么vcl_recv的默认行为将被应用。请阅读http://www.varnish-cache.org/trac/wiki/VCLExampleDefault并学习default.vcl。回答您的问题:是的,您必须传递它们。如果您没有显式传递foo和bar域,并且您的GET或HEAD请求不包含auth或cookie头,则会进行查找。 - ivy
这对于Varnish 2来说是可行的。你应该更新你的回答,包括Varnish 3的代码,即return (pass)和return(pipe)。 - Mark Theunissen
如果这个方法不起作用,请确保 sub vcl_fetch { 中有一个相应的 return(hit_for_pass);,无论在 sub vcl_recv { 中有多少个 return(pass); - yitwail
我强烈建议不要硬编码“return(lookup)”。清理请求,然后让默认策略决定是否可以缓存它。当强制缓存时,您已经开始缓存会话cookie,这可能是灾难性的。 - perbu
显示剩余2条评论

6

是的,在vcl_recv中,您只需匹配您不想缓存并传递它们的主机。类似这样(未经测试):

vcl_recv {
   # dont cache foo.com or bar.com - optional www
   if (req.host ~ "(www)?(foo|bar).com") {
     return(pass);
   }
}

@CamiloFlores 你应该回滚并将你的编辑作为新答案发布(或者在此帖子下评论)。 - Adriano Repetti
不要使用管道,当您有多个后端和/或保持活动连接时,由Varnish处理任何标头都会成为噩梦。 - BrenoZan
我不知道为什么在这里使用了return(pipe)。对于造成的困惑,我感到很抱歉。 - perbu
我尝试过了,但是Varnish没有启动。为什么要发布未经测试的信息呢? - m3nda
你缺少 sub vcl_recvreq.http.host - m3nda

2

对于Varnish 4

将lookup替换为hash

default.vcl:

sub vcl_recv {
  # dont cache foo.com or bar.com - optional www
   if (req.http.host ~ "(www\.)?(foo|bar)\.com") {
     return(pass);
   }
  # cache foobar.com - optional www
   if (req.http.host ~ "(www\.)?foobar\.com") {
     return(hash);
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接