基于标题的清漆缓存

时间:2013-07-18 14:46:38

标签: php caching varnish

目前我在运行大约30-40个不同网站的服务器上运行Varnish。所有这些网站都使用相同的库来处理请求(每个网站都有自己的域)。但是,其中一些网站非常简单,可以完全缓存。我想要做的是在项目/网站(特定标题)中启用一个标志,告诉varnish在交付后缓存请求。这样的构造是否可行,因为我不想为每个可以完全缓存的项目编辑VCL,并向vcl_fetch添加一个条目,如:

if (req.http.host ~ "<website>")
{
    unset req.http.cookie;
    return (lookup)
}

有没有正确的方法呢?我确实看过Varnish流程图,但无法找到一个好的解决方案。

提前致谢!

4 个答案:

答案 0 :(得分:1)

我刚刚开始使用Varnish并喜欢这个主意。因为我有麻烦,我只想缓存几个域,并且不想一直更改vcl。

我研究设置一个“特殊”标题,然后让清漆做出魔术。

但后来我查看了文档并且有更简单的方法。

header('Cache-Control: public, max-age=10');

这样varnish将内容缓存10秒。因此,如果您希望永久缓存它,那么您可以使用非常高的整数来接近它。

// Caches the content for a year, if my calculations are right :P
header('Cache-Control: public, max-age=' . (60 * 60 * 24 * 365));

答案 1 :(得分:1)

我希望这可以帮到你。在下面的示例中,自定义标头用作条件。

sub vcl_fetch {
    if (req.http.Custom-Header == "www.site.com" {
       set beresp.ttl = [...]
       [...]
     }
     elsif (req.http.Custom-Header == "www.site2.com" {
       set beresp.ttl = [...] 
      }
      else {
      [...]
      }
      return(deliver);
}

答案 2 :(得分:1)

Varnish将尊重响应标头中后端表示的TTL。 如果要缓存站点X,请使用mod_expires(或类似)并从后端正确设置TTL。如果您希望不缓存网站Y,请设置Cache-Control: s-maxage=0,Varnish不会缓存它。

如果你必须有一个特定的响应标题,这里有一些例子VCL:

  sub vcl_fetch {
       if (beresp.http.x-do-not-cache) {
           set beresp.ttl = 0s;
       }
  }

请注意,我在这里没有做return()。通过设置TTL并降至默认VCL Varnish将自行处理。

答案 3 :(得分:0)

默认情况下,Varnish在不更改任何VCL的情况下,读取后端返回的HTTP 1.1标准缓存头(Cache-Control,Expires等),并根据这些头缓存对象。因此,只要您在vcl_recv中return (lookup);,Varnish就已经配置为按照您的意愿执行。

相关问题