我有一个使用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个问题:
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)。
此外,经过几周的挖掘,我真的不知道自己在做什么,所以如果你在配置中发现奇怪的东西,请告诉我。
答案 0 :(得分:18)
我很惊讶10个月内没有真正完整的答案。这可能是一个非常有用的页面。
你自己指出:
首先,您应用中的每个人都需要会话吗?如果没有,请不要启动会话,或至少延迟启动它,直到确实需要(即他们登录或其他)。
如果您仍然可以在用户登录时缓存页面,则需要非常小心,不要为用户提供适合其他人的页面。但是如果您要这样做,请编辑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缓存请求。