1

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

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

有没有合适的方法来做到这一点?我确实看过 Varnish 流程图,但想不出一个好的解决方案。

提前致谢!

4

4 回答 4

2

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

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);
}
于 2013-07-18T15:16:37.440 回答
1

好吧,我刚开始使用 Varnish 并喜欢这个想法。因为我遇到的麻烦是我只想缓存几个域并且不想一直更改 vcl。

我研究了设置一个“特殊”标题,然后让清漆发挥作用。

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

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

这样清漆缓存内容 10 秒。因此,如果您想永远缓存它,那么您可以使用一个非常高的整数来接近。

// Caches the content for a year, if my calculations are right :P
header('Cache-Control: public, max-age=' . (60 * 60 * 24 * 365));
于 2013-07-18T15:07:52.663 回答
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 将自行处理。

于 2013-07-31T14:19:23.490 回答
0

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

于 2013-07-18T16:17:43.477 回答