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

Ond*_*ták 31 php varnish symfony

我有一个使用Symfony2反向代理进行缓存的网站(使用ESI).平均响应约为100毫秒.我试图在服务器上安装Varnish来试试.我一步一步地按照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
Run Code Online (Sandbox Code Playgroud)

这是大约14000个请求,所以我认为一切都会好起来的.但是在发现之后我发现反应提高到了约2秒.

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

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


根据请求,这是我default.vcl迄今为止做过的修改.

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

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

所以我将这些情况的条件添加到我的配置中并且它现在表现相当不错(~175 req/s从~160使用S2反向代理 - 但老实说,我期望更多).我只是不知道如何检查它是否全部设置好,所以欢迎任何输入.

大多数页面的缓存都是由cookie改变的,有s-maxage1200个.常见的ESI包括不会因cookie而变化,s-maxage相当低(文章,文章列表).用户配置文件页面根本没有缓存(no-cache),我不确定ESI是否包括在这些页面甚至被Varnish缓存.只有通过cookie改变的ESI是具有用户特定信息的标题(在100%的页面上).

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

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

在此输入图像描述

exg*_*exg 18

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

你自己指出:

  • Varnish不会使用cookie缓存请求
  • Varnish忽略Cache-Control:no-cache标头

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

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

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

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

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

backend default {
    .host = "127.0.0.1";
    .port = "80";
}
Run Code Online (Sandbox Code Playgroud)

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


Raf*_*hes 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;}

}
Run Code Online (Sandbox Code Playgroud)

这在清漆中仅缓存设置为可缓存的请求。另外,请注意您的配置不会缓存带有 cookie 的请求。