Varnish构建高负载Drupal网站 – 高级篇

继上篇高负载网站之Varnish与Drupal – 基本篇后,本篇咱们来深刻讨论Varnish的优化,缓存页面,ESI,Cookie过滤,登陆用户的缓存以及与drupal的配合使用等相关话题。php

首先咱们熟悉一下两个VCL的函数css

regsub(string, pattern, replacement); //正则替换 regsuball(string, pattern, replacement); //同上,只是替换全部遇到的问题


开启VCL Debug信息
再优化以前,咱们来开启VCL的调试功能。在当前的active.acl里面,加入以下函数,html

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。node

默认状况下,varnish提供一个http头,X-Varnish,它包含两个数字,一个是当前请求的ID,另外一个是缓存中的ID,这代表,若是X-Varnish含有两个值,则缓存命中,反之没有命中。ajax

基本优化
默认状况下,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/VCLExampleCachingLoggedInUserscookie

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>

附录B Varnish的缓存以及VCL的流程图

相关文章:
高负载网站之Varnish与Drupal – 基本篇
Drupal性能优化之-将Boost模块用到极致

声明: 本站全部文章欢迎转载,全部文章未说明,均属于原创,转载均请注明出处。
本文有效连接:http://www.drupal001.com/2011/12/varnish-drupal-advanced/
版权全部: Drupal与高性能网站架构 http://www.drupal001.com

相关文章
相关标签/搜索