目前我在运行大约30-40个不同网站的服务器上运行Varnish。所有这些网站都使用相同的库来处理请求(每个网站都有自己的域)。但是,其中一些网站非常简单,可以完全缓存。我想要做的是在项目/网站(特定标题)中启用一个标志,告诉varnish在交付后缓存请求。这样的构造是否可行,因为我不想为每个可以完全缓存的项目编辑VCL,并向vcl_fetch添加一个条目,如:
if (req.http.host ~ "<website>")
{
unset req.http.cookie;
return (lookup)
}
有没有正确的方法呢?我确实看过Varnish流程图,但无法找到一个好的解决方案。
提前致谢!
答案 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就已经配置为按照您的意愿执行。