我有一个使用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个请求中,所以我认为一切都会好起来的。但是在 echo 之后,我发现响应提高到了约2秒。
Apache在9000端口上运行,在8080上运行Varnish。因此,我使用
echoping -n 10 -h http://servername/ X.X.X.X:8080
回显。我不知道有什么问题。将Varnish与Symfony2结合使用是否需要其他设置?还是我只是做错了什么?
根据请求,这是我到目前为止所做的修改的
default.vcl
。我发现Varnish的默认配置有2个问题:
Cache-Control: no-cache
header 因此,我将这些情况的条件添加到了配置中,并且它的性能现在相当好(使用S2反向代理时从〜160达到约175 req/s,但老实说,我期望更多)。我只是不知道如何检查所有设置是否正确,因此欢迎任何输入。
大多数页面的缓存因cookie而异,但
s-maxage
为1200。常见的ESI包含内容因cookie而异,但s-maxage
相当低(文章,文章列表)。用户个人资料页面根本不会被缓存(no-cache
),而且我真的不确定Varnish是否会缓存其中包含的ESI。只有因Cookie而异的ESI才是带有用户特定信息的 header (在100%的页面上)。这篇文章中的所有内容都是针对Varnish 3.X的(我个人使用的是3.0.2)。
另外,经过数周的研究,我真的不知道自己在做什么,因此,如果您发现配置有些奇怪,请告诉我。
最佳答案
我很惊讶这在10个月内还没有得到真正完整的答案。这可能是一个非常有用的页面。
您指出自己:
第一件事是,您应用中的每个人都需要一个 session 吗?如果没有,请不要启动 session ,或者至少延迟启动 session ,直到真正必要时(即他们登录或以其他方式登录)。
如果您仍可以在用户登录时缓存页面,则需要非常小心,不要为用户提供一个供他人使用的页面。但是,如果要执行此操作,请编辑vcl_recv()以剥离要缓存的页面的 session 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或其他端口上查找后端。
关于php - 如何为 Symfony2 站点正确设置 Varnish?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8929160/