如何为Symfony2网站正确设置清漆?

2022-08-30 14:38:28

我有一个网站(带有ESI),它使用Symfony2反向代理进行缓存。平均响应约为100ms。我试图在服务器上安装Varnish来尝试一下。我一步一步地按照Symfony食谱的指南,删除了文件夹中的所有内容,但是当我尝试时仍然创建了文件夹。所以我想我可以尝试从中注释掉。这效果很好。 不再被创建,通过varnishstat,Varnish似乎正在工作:cachehttp_cache$kernel = new AppCache($kernel);app.phphttp_cache

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

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

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

我不知道可能出了什么问题。将清漆与 Symfony2 配合使用是否需要任何其他设置?还是我只是做错了什么?


根据请求,这是我的 default.vcl,其中包含到目前为止我所做的修改。

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

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

因此,我在配置中添加了这些情况的条件,现在它的表现相当不错(从S2反向代理的~160增加到约175 req / s - 但老实说,我期望更多)。我只是不知道如何检查它是否一切正常,所以欢迎任何输入。

大多数页面的缓存因 cookie 而异,为 1200。常见的ESI包含不因cookie而异,相当低(文章,文章列表)。用户配置文件页面根本没有缓存(),我真的不确定这些页面上的ESI是否被Varnish缓存。只有受 Cookie 影响的 ESI 是包含用户特定信息的标题(在 100% 的页面上)。s-maxages-maxageno-cache

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

另外,经过几周的深入研究,我真的不知道我在做什么了,所以如果你在配置中发现一些奇怪的东西,请告诉我。

enter image description here


答案 1

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

你自己指出:

  • 清漆不会使用 Cookie 缓存请求
  • 清漆忽略缓存控制:无缓存标头

第一件事是,您的应用程序中的每个人都需要会话吗?如果没有,请不要启动会话,或者至少延迟启动它,直到真正有必要(即他们登录或其他什么)。

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

您可以轻松地让Varnish在vcl_fetch()中处理无缓存指令,实际上您已经这样做了。

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

我还注意到,您在Varnish中设置了端口以:

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

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


答案 2

如果这是您的整个配置,则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;}

}

这个在清漆中仅缓存设置为可缓存的请求。此外,请注意,您的配置不会使用 Cookie 缓存请求。


推荐