我有一个使用 Symfony2 反向代理进行缓存的网站(带有 ESI)。平均响应时间约为 100 毫秒。我尝试在服务器上安装 Varnish 来试用一下。我关注了guide from Symfony cookbook逐步删除了 cache
文件夹中的所有内容,但是当我尝试它时 http_cache
文件夹仍然被创建。所以我想我可以尝试从 app.php
中注释掉 $kernel = new AppCache($kernel);
。效果很好。 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
进行回显。
我不知道哪里出了问题。在 Symfony2 中使用 Varnish 是否需要任何额外的设置?还是我只是做错了什么?
根据要求,这是我的 default.vcl
到目前为止我已经做了一些修改。
我发现 Varnish 的默认配置存在 2 个问题:
- 它不会缓存带有 cookie 的请求(我的应用程序中的每个人都分配了 session )
- 它忽略
Cache-Control: no-cache
header
所以我在我的配置中添加了这些情况的条件,它现在表现得相当好(使用 S2 反向代理从 ~160 提高到 ~175 req/s - 但老实说,我期望更多)。我只是不知道如何检查是否一切正常,所以欢迎任何意见。
大多数页面的缓存因 cookie 而异,s-maxage
1200。常见的 ESI 包含不受 cookie 的影响,s-maxage
非常低(文章,文章列表)。用户配置文件页面根本没有缓存(no-cache
),我不确定 ESI 是否包含在这些页面上什至被 Varnish 缓存了。只有因 cookie 而异的 ESI 是带有用户特定信息的 header (在 100% 的页面上)。
这篇文章中的所有内容都是 Varnish 3.X 特定的(我个人使用的是 3.0.2)。
此外,经过几周的深入研究,我真的不知道自己在做什么了,所以如果您在配置中发现一些奇怪的地方,请告诉我。
最佳答案
令我惊讶的是,这 10 个月来还没有真正完整的答案。这可能是一个非常有用的页面。
您自己指出:
- Varnish 不使用 cookie 缓存请求
- Varnish 忽略 Cache-Control: no-cache header
首先,您应用中的每个人都需要 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/