了解 Varnish:它能在网站上缓存 10,000 个静态页面吗?

了解 Varnish:它能在网站上缓存 10,000 个静态页面吗?

首先,我使用:APC、W3TC、PHP5、Wordpress 3.8、Apache 2.2,并且遇到了很多“缓存未命中”

我仍然不太了解 Varnish。以下是我在几分钟的运行中从 Unixy 后端获取的一些统计数据:

客户端连接数:3744 客户端丢弃数:0 客户端请求数:3910 缓存命中数:914 缓存未命中数:2347

我将 Varnish 内存改为 3GB RAM(总共 8GB)。

Varnish 只缓存那些经常被访问的页面,这正常吗?假设你的网站有 10,000 个页面,Varnish 能把所有页面都缓存起来吗?还是只缓存一定数量的经常被访问的页面?

所以我的问题实际上是如何改进 Varnish 以缓存更多页面并将它们长时间保存在缓存中(主要是不需要大量刷新的静态页面)

答案1

3GB 应该足够了,说真的。如果你真的达到了极限,你不会出现缓存未命中,但会出现缓存丢失,在你的情况下是:0。

所以记忆可能是不是问题。

varnish 的内存使用情况非常简单,它工作时占用的内存并不多,大部分内存用于存储对象,对象是有关您的网页的,因此 varnish 中缓存的 50kb 的 html 页面将使用大约 ~50kb 的内存。

但是,如果您的对象及其关联对象哈希不同,例如因为存在不同的查询参数(例如,不影响联系人但用于跟踪),则每个对象将被单独缓存。

以下是计算对象哈希值的默认 vcl:

sub vcl_hash {
  hash_data(req.url);
  if (req.http.host) {
    hash_data(req.http.host);
  } else {
    hash_data(server.ip);
  }

  return (hash);
}

如您所见,它基于完整的 URL 和主机。它存在一个查询字符串-vmod对查询参数进行排序和/或删除以增加命中数。

这可能是一个很好的开始,以检查您的对象是否不被 Varnish 认为不同(在大多数情况下是因为查询参数)。

但就您而言,我实际上怀疑您有 cookie 和/或错误的缓存控制标头。

默认情况下,Varnish 会忽略所有带有 cookie 的请求,从而增加缓存未命中次数。

sub vcl_recv {
  // ...

  if (req.http.Authorization || req.http.Cookie) {
    /* Not cacheable by default */

    return (pass);
  }
}

如果您确实知道自己在做什么,您可以从请求中删除 cookie 并强制缓存您的对象,但要小心,您可以通过这种方式缓存将传递给访客的管理页面。

例如,您可以定义应该缓存哪个 url 并设置Cache-Control: public标头,然后在您的 vcl 中检测公共Cache-Control标头、删除 cookie 并缓存。

但还是那句话,要小心。


编辑:您可能对这篇文章感兴趣:Varnish 和 Wordpress在 Varnish 文档上

答案2

在 Unixy Varnish 配置之上,我在研究了各种配置之后添加了这个,也许其中一些是多余的,但我的缓存命中率现在好多了,比如 60%,我设法将 CPU 负载从 3 降低到 0.10 - 0.50

WordPress 后端

if (!(req.url ~ "wp-(login|admin)")) {
                unset req.http.cookie;
        }

其他文件

  if ( req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$" ) {

        unset req.http.cookie;
  }

饼干

if (req.http.Cookie) {
    set req.http.Cookie = regsuball(req.http.Cookie, "(^|; ) *__utm.=[^;]+;? *", "\1");

    if (req.http.Cookie == "") {
        remove req.http.Cookie;
    }
}

清除

if (req.request == "PURGE") {
return (lookup);
}

另外 3GB 有点太多了,我可能会把它改回 1 或 2GB ..即使有 10,000 页或更多,但我会让它运行 24 小时,看看

相关内容