首先,我使用: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 小时,看看