继上篇高负载网站之Varnish与Drupal – 基本篇后,本篇我们来深入讨论Varnish的优化,缓存页面,ESI,Cookie过滤,登录用户的缓存以及与Drupal的配合使用等相关话题。
首先我们熟悉一下两个VCL的函数
regsub(string, pattern, replacement); //正则替换 regsuball(string, pattern, replacement); //同上,只是替换所有遇到的问题 |
开启VCL Debug信息
再优化之前,我们来开启VCL的调试功能。在当前的active.acl里面,加入如下函数,
sub vcl_deliver { if (obj.hits > 0) { set resp.http.X-Cache = "HIT"; } else { set resp.http.X-Cache = "MISS"; } } #如果需要详细的了解cookie值,可以在vcl_fetch里面加入如下代码 sub vcl_fetch { # Debug the req cookie set obj.http.X-Cookie-Debug = "Request cookie: " req.http.Cookie; } |
这样在HTTP Header里面我们添加了调试信息,如果缓存命中,则是HIT反之为MISS。
默认情况下,varnish提供一个http头,X-Varnish,它包含两个数字,一个是当前请求的ID,另一个是缓存中的ID,这表明,如果X-Varnish含有两个值,则缓存命中,反之没有命中。
基本优化
默认情况下,Varnish不缓存任何有Cookie的请求,带有Cookie的请求,Varnish认为是私有的HTTP会话,会直接pass到backend。所以我们首先要删除Cookie。一般情况下,对于图片、附件、css、js等文件,是不需要cookie会话的,所以我们需要对其缓存。
在vcl_recv里面添加如下代码
# cache these file types if (req.url ~ "\.(jpg|png|css|js|ico|gz|tgz|bz2|tbz|gif)$") { remove req.http.cookie; } |
Drupal动态内容的缓存
默认的Drupal会开启session,页面会带有session生成的cookie值和value,这样Varnish就无法缓存内容页面。
方法A,在Drupal添加代码,给每个Role设置一个cookie,然后在VCL中检查检查,如果是匿名用户就删除所有cookie。
方法B,使用Drupal的PressFlow版本,PressFlow会默认清理掉匿名用户的Cookie。
ESI之动态内容
对于随时当前用户变动的信息,需要即时刷新,和SSI类似,我们可以用类似部分包含的方法,通过ESI,我们可以调用一些动态内容。详细的了解请参阅官方网站。
Drupal已经有一个模块,Edge Side Includes integration,可以将Drupal的Block转换成ESI include的形式。
正常登陆和非登陆情况下测试成功,但问题在于这两种情况下,页面的HTML并没有缓存成功。
所以关于登陆用户的ESI缓存,比较困难。
有解决方案,就是把Cookie的值通过ESI的URL来传递,但是目前的ESI也不支持。
https://www.varnish-cache.org/trac/wiki/VCLExampleCachingLoggedInUsers
PS:如果使用Varnish3.0,请下载新的配置文件 http://drupal.org/node/1388950
Varnish和Boost搭配使用
前文Drupal性能优化之-将Boost模块用到极致,详细讲解了使用CSI(ajax)对于登录用户的处理。
因为Varnish对页面缓存的实效性、已经不完整性,用Boost可以做有效的补充。通常情况下,Varnish做一般的缓存代理,后端用Boost生成静态页面,把Varnish的逻辑减少,服务器结构之间相对简单一些,以便于维护。
这里有一篇文章,讲解了如何使用Boost和Varnish模块,详情请参阅:Boosted Varnish – High Performance Caching made easy
结论
Varnish的ESI对登录用户的支持有限,所以一般情况下,我们只作为前段缓存和代理来使用,如果要缓存登录用户,即使我们使用Cookie的Hash,使用大量的内存提高缓存,缓存的使用率也是非常低的。因此我们还是使用Boost的CSI(ajax)来实现,调试方式也比Varnish的ESI简单。
附录A Varnish缓存清理PHP接口
Varnish官方站给出了PHP的接口文件,但是该文件有很多bug以及Varnish3.0不能使用等原因,经过修改和调试,分享供大家使用。
注意:如果只用一个vpurge.php通过GET方式获得URL,那么该vpurge.php也会被varnish缓存,所以使用html form提交POST的方式清除缓存是比较好的选择。
1. vpurge.php 文件
$ip = '127.0.0.1';// $port = '6082'; // $timeout = 1; $verbose = 1; # inits $sock = fsockopen ($ip,$port,$errno, $errstr,$timeout); if (!$sock) { echo "connections failed $errno $errstr"; exit; } # get param and strip invalid stuff $url = $_POST['url']; if (!$url) { echo "No params"; exit; } stream_set_timeout($sock,$timeout); put ("ban.url ". $url .'$'); #Varnish 3.0需要修改成 purge.url put ("quit"); fclose ($sock); function readit() { global $sock,$verbose; if (!$verbose) { return; } while ($sockstr = fgets($sock,1024)) { $str .= "rcv: " . $sockstr . " "; } if ($verbose) { echo "$str\n"; } } function put($str) { global $sock,$verbose; fwrite ($sock, $str . "\r\n"); if ($verbose) { echo "send: $str \n"; } readit(); } |
2. purge.html
<h1>Makes Varnish purge the supplied URL from its cache</h1> <form action="vpurge.php" method="post"> <p><label>URL</label> <input type="text" name="url"></p> <p class="submit"><input value="Submit" type="submit"></p> </form> |
相关文章:
高负载网站之Varnish与Drupal – 基本篇
Drupal性能优化之-将Boost模块用到极致
声明:
本站所有文章欢迎转载,所有文章未说明,均属于原创,转载均请注明出处。
本文有效链接:
http://www.drupal001.com/2011/12/varnish-drupal-advanced/
版权所有:
Drupal与高性能网站架构
http://www.drupal001.com
评论:2
发表评论