我可以在Varnish中完成这个吗?

时间:2014-05-14 23:10:26

标签: caching nginx varnish esi

我有一个网站,通过来自许多不同网站的RSS源提取新闻文章。该脚本将这些文章添加到mysql数据库中。我在很多页面上向观众展示了10篇文章。

目前,每次更新脚本向数据库添加新文章时,我都会缓存整个页面并清除缓存。它速度快但效率不高。缓存的页面只有几分钟的生命周期,即使文章本身可以缓存更长时间。

我可以使用varnish将各个文章存储在缓存中吗?因此,生成的每个页面都会有文章的链接/指针/引用,而不是文章本身。然后,我可以在短时间内缓存这些页面,同时将文章缓存更长时间。

我如何在Varnish或任何其他缓存机制上执行此操作?这会比缓存命中的整页缓存更糟/更差吗?

我在Ubuntu 12.04和nginx上。

谢谢!

1 个答案:

答案 0 :(得分:3)

您想使用edge side includes。基本上,您的页面使用ESI链接:

<div class="articles">
  <esi:include src="/path/to/article/1"/>
  <esi:include src="/path/to/article/2"/>
  <esi:include src="/path/to/article/3"/>
</div>

现在在Varnish中,有这个:

sub vcl_fetch {
  set beresp.do_esi = true;
}

或在Varnish 4中:

sub vcl_backend_response {
  set beresp.do_esi = true;
}

当上述代码通过Varnish时,Varnish会将每个esi:include替换为网址/path/to/article/1的内容。您可以将页面本身缓存几分钟,将每篇文章缓存几天。