主頁 > Drupal | 服務器技術 > 用Varnish加速動態頁面-對PHP/Drupal的頁面緩存

用Varnish加速動態頁面-對PHP/Drupal的頁面緩存

PDF版本

varnish的基本介紹就不在此贅述,關于使用varnish緩存,之前也有幾篇文件進行介紹,不過大部分情況下,我們使用varnish限于兩個方面,其一是用varnish做反向代理,另一個用途就是用它來緩存靜態內容,比如圖片、css、js文件等。既然varnish可以緩存任何http請求,那么本文就varnish關于動態頁面的緩存做一些測試和應用,文中舉例基于drupal系統,也可以應用基于PHP的其他系統。

對于Varnish的基本概念,請參考之前的兩篇文章:
高負載網站之Varnish與Drupal – 基本篇
Varnish構建高負載Drupal網站 – 高級篇

首先了解幾個概念,

1. Varnish不緩存帶有Set-Cookie頭的http輸出。
2. 對于HTTP協議中緩存部分,Varnish遵從http協議部分。如:帶有如下頭信息,Control-Cache: no-store, no-cache, must-revalidate, post-check=0, pre-check=0,默認varnish不會緩存。
3. HTTP協議中緩存部分,Control-Cache優先于Expires,Pragma: no-cache 是HTTP1.0的產物,可以不考慮。

Varnish緩存操作,一般有兩個方法,
1. 在varnish的配置文件設置。
2. 通過http協議指定,比如Control-Cache。

第一種方法耦合性較低,只需修改vcl即可,但是靈活性較差,如果要獨立設置每個頁面的ttl可能比較麻煩。
第二種方法較為靈活,可以設置每一個頁面的緩存時間,比如Control-Cache: max-age=10. (緩存10秒),缺點就是耦合性,既要在PHP端設置,又要在Varnish里面設置。

小插曲:如果使用Control-Cache: max-age=10這種方式緩存的話,varnish可以緩存,但是會出現一個問題,客戶端的瀏覽器同樣會緩存,如果不讓客戶端瀏覽器緩存,而只讓varnish緩存,可以使用 Control-Cache: max-age=0; s-maxage:10.

這里,我們選擇使用VCL,也就是上面所說的第一種方法來緩存http動態頁面。
如下假設:
a) 要緩存的頁面url為 /abc/* 的形式,
b) 只緩存匿名用戶的頁面(登錄用戶以后再介紹)
c) 登錄用戶需要有一個獨有的cookie,如DRUPAL_UID=11

1. 在vcl_recv里面添加如下代碼(此處,一定要將登錄用戶的請求pass到后端服務器,否則,也會得到緩存頁面,因為varnish的hash默認沒有cookie,所以登錄用戶同樣會命中匿名用戶的緩存數據)。

 if (req.request == "GET" && req.url ~ "^/abc/.*") {
    if (req.http.Cookie ~ "DRUPAL_UID=[1-9][0-9]*") {
      return (pass);
    } else {
      remove req.http.Cookie;
      return (lookup);
    }
 }

2. 在vcl_fetch里面添加如下代碼

if (req.request == "GET" && req.http.Cookie !~ "DRUPAL_UID=[1-9][0-9]*" && req.url ~ "^/abc/.*") {
    unset beresp.http.Pragma;
    unset beresp.http.Expires;
    unset beresp.http.set-cookie;
    set beresp.ttl = 2h; #time to live
    set beresp.do_gzip = true;
    set beresp.grace = 20m; #grace time
    return (deliver);
  }

在vcl_fetch里面注意,最好把set-cookie unset掉,這樣就不會修改客戶端的cookie了(一般情況,varnish向后臺用戶發送的是匿名請求,這樣set-cookie肯定是一個匿名的session信息,如果當前用戶是登錄用戶,就會導致當前用戶logout,這點特別注意)。

這樣,就在varnish里面強制緩存了所有/abc/開始的頁面內容,緩存時間為2小時。

最后補充一個vcl的調試技巧,在varnish3.x里面引入了std模塊,varnish vmod_std包含了一些常用函數,所以調試vcl的時候,我們可以使用std.syslog(1, xxx)等語句,將某個變量記錄到syslog里面(/var/log/messages),方便觀察結果。

在Varnish的設置中,理解其處理http請求的過程非常重要,因此,這里貼一張VCL的流程圖,以便更好的理解varnish處理的過程。

varnish flow

varnish 處理http的流程

后記:關于登錄用戶頁面的緩存,下一篇再做討論。Varnish的負載均衡配置,可以參考這篇文章《Varnish前端代理Drupal的配置以及Jenkins》。


聲明: 本站所有文章歡迎轉載,所有文章未說明,均屬于原創,轉載均請注明出處。
本文有效鏈接: http://www.tbdskt.live/2013/05/varnish-cache-php-output/
版權所有: Drupal與高性能網站架構 http://www.tbdskt.live


, ,

評論:2

發表評論
  1. avatar
    回復 sens
    13/07/23

    博主,在fetch中確實緩存了頁面,但是第二次用戶請求過來再recv中還會走pass,這樣就起不到緩存的效果,不知道你測試結果如何。

    • avatar
      回復 robbin
      13/08/01

      你看看你的http里面的vary變量,如果把其他不用的去掉,比如user-agent

發表評論

電子郵件地址不會被公開。 必填項已用 * 標注


八 − 5 =

您可以使用這些 HTML 標簽和屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

引用:1

下面所列的是引用到本博客的鏈接
用Varnish加速動態頁面-對PHP/Drupal的頁面緩存 來自 Drupal與高性能網站架構
pingback 來自 研究Varnish | Tinyfool的Blog 2014 年 1 月 21 日

[…] 用Varnish加速動態頁面-對PHP/Drupal的頁面緩存 […]

頂部
四川时时彩投注平台