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

标签 php symfony varnish

我有一个使用 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)。

此外,经过几周的深入研究,我真的不知道自己在做什么了,所以如果您在配置中发现一些奇怪的地方,请告诉我。

enter image description here

最佳答案

令我惊讶的是,这 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/

相关文章:

php - 如何合并和处理 2 个 symfony 表单?

PHP session导致varnish不缓存

https - 将 Varnish 与 SaaS HTTPS 后端服务器一起使用?

php - 如何获取 file_get_contents() 警告而不是 PHP 错误?

PHP DOMDocument 用 HTML 字符串替换 DOMElement 子元素

symfony - Symfony2 路由中的两个可选变量

php - 为什么 Symfony 3 单元测试从实际的包中移出?

nginx - 启动,重启或停止 Varnish

php - 从 css 读取值

java - editText 消息未保存到数据库中