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

相關文章
相關標籤/搜索