如何为Symfony2站点正确设置Varnish?

时间:2012-01-19 15:58:31

标签: php symfony varnish

我有一个使用Symfony2反向代理进行缓存的网站(使用ESI)。平均响应约为100毫秒。我试图在服务器上安装Varnish来试试。我一步一步地跟着guide from Symfony cookbook,删除了cache文件夹中的所有内容,但是当我试用它时仍然创建了http_cache文件夹。所以我想我可以尝试从$kernel = new AppCache($kernel);发表评论app.php。这非常有效。 http_cache不再创建了,varnishstat,Varnish似乎正在工作:

12951         0.00         0.08 cache_hitpass - Cache hits for pass
 1153         0.00         0.01 cache_miss - Cache misses

大约有14000个请求,所以我认为一切都会好起来的。但是在回声之后我发现回复提高到了约2秒。

Apache在端口9000和Varnish上运行8080.所以我在使用echoping -n 10 -h http://servername/ X.X.X.X:8080

我不知道出了什么问题。是否需要使用Varnish与Symfony2进行任何其他设置?或者我只是做错了什么?


根据请求,这是我的default.vcl,我已做过修改。

我在Varnish的默认配置中发现了2个问题:

  • 它不会使用cookie缓存请求(我的应用中的每个人都分配了会话)
  • 忽略Cache-Control: no-cache标题

所以我在这个配置中添加了这些情况的条件,现在表现相当不错(~160 req / s从~160反向代理~~但老实说,我预计会更多)。我只是不知道如何检查它是否全部设置好,所以欢迎任何输入。

大多数网页的缓存因Cookie而异,s-maxage 1200.常见的ESI包含不会因Cookie而异,s-maxage非常低(文章,文章列表)。用户个人资料页面根本没有缓存(no-cache),我不确定ESI是否包括在这些页面甚至被Varnish缓存。只有通过cookie改变的ESI是具有用户特定信息的标题(在100%的页面上)。

这篇文章中的所有内容都是Varnish 3.X特定的(我个人使用3.0.2)。

此外,经过几周的挖掘,我真的不知道自己在做什么,所以如果你在配置中发现奇怪的东西,请告诉我。

enter image description here

2 个答案:

答案 0 :(得分:18)

我很惊讶10个月内没有真正完整的答案。这可能是一个非常有用的页面。

你自己指出:

  • Varnish不会使用Cookie缓存请求
  • Varnish忽略Cache-Control:no-cache header

首先,您应用中的每个人都需要会话吗?如果没有,请不要启动会话,或至少延迟启动它,直到确实需要(即他们登录或其他)。

如果您仍然可以在用户登录时缓存页面,则需要非常小心,不要为用户提供适合其他人的页面。但是如果您要这样做,请编辑vcl_recv()以删除要缓存的页面的会话cookie。

您可以轻松地获取Varnish来处理vcl_fetch()中的no-cache指令,实际上您已经完成了。

我发现的另一个问题是Symfony默认将max-age设置为0,这意味着它们不会被vcl_fetch中的默认逻辑缓存

我还注意到你在Varnish中设置了端口:

backend default {
    .host = "127.0.0.1";
    .port = "80";
}

你自己说Apache在端口9000上运行,所以这似乎不匹配。您通常会将Varnish设置为侦听默认端口(80)并将Varnish设置为在端口9000或其他任何位置查找后端。

答案 1 :(得分:1)

如果这是您的整个配置,则vcl_recv配置两次。

在要缓存的页面中,是否可以发送缓存标头?这将是最有意义的,因为图像可能已经有你的apache缓存标题和应用程序逻辑决定了可以实际缓存的页面,但你也可以在清漆中强制执行此操作。

您可以像这样使用vcl_recv:

# Called after a document has been successfully retrieved from the backend.
sub vcl_fetch {

    # set minimum timeouts to auto-discard stored objects
    # set beresp.prefetch = -30s;
    set beresp.grace = 120s;

    if (beresp.ttl < 48h) {
      set beresp.ttl = 48h;}

    if (!beresp.cacheable) 
        {pass;}

    if (beresp.http.Set-Cookie) 
        {pass;}

    # if (beresp.http.Cache-Control ~ "(private|no-cache|no-store)") 
    # {pass;}

    if (req.http.Authorization && !beresp.http.Cache-Control ~ "public") 
        {pass;}

}

这个在varnish中缓存只有可设置为可缓存的请求。另外,请注意您的配置不会使用cookie缓存请求。