繼上篇高負載網站之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>
相關文章:
高負載網站之Varnish與Drupal – 基本篇
Drupal性能優化之-將Boost模塊用到極致
聲明: 本站全部文章歡迎轉載,全部文章未說明,均屬於原創,轉載均請註明出處。
本文有效連接:http://www.drupal001.com/2011/12/varnish-drupal-advanced/
版權全部: Drupal與高性能網站架構 http://www.drupal001.com