主頁 > Drupal | 服務器技術 > Drupal性能優化之-將Boost模塊用到極致

Drupal性能優化之-將Boost模塊用到極致

PDF版本

Boost模塊是drupal的一個靜態頁面緩存模塊,效率非常之高,如果還不了解,請參考《讓豬去飛-Drupal性能優化貼》,本文就使用Boost以及如何 hack該模塊來打造高性能Drupal網站做簡單介紹。

一般情況下,Boost模塊適用于匿名訪問多的Drupal站點,因為這會直接去訪問事先建好的靜態頁面,效率很高,不需要進行數據庫查詢。但是在很多情況下,我們的網站需要用戶登錄,以登錄用戶的方式訪問網站,但是,網站的很多內容其實和匿名用戶看到的完全一樣。

舉個例子,比如新浪博客,騰訊博客等。當用戶登錄之后和匿名用戶看到的博文完全一樣,唯一不同的就是上面的用戶信息(topbar),也可以稱之為頂欄或者側欄。(參考下圖)

Boost緩存終極圖解
當用戶登錄之后,上面的頂欄信息就會變成用戶名和用戶的個人信息鏈接。如果仔細觀察,會發現(很多網站,如新浪、淘寶)的信息欄不是立刻加載的。也就是說用戶信息欄的內容是異步的,當整個網頁加載之后,上面的信息通過ajax,或者flash,或者iframe等異步方式獲取。

所以,我們可以做這樣一個結構的頁面:把用戶信息塊用javascript腳本填充,其余部分均是靜態內容,用戶信息塊在頁面初始化的時候通過ajax方式動態加載,如果沒有登錄,顯示登錄連接;如果已經登錄,則顯示用戶歡迎信息。

如此一來,所有public的頁面(注意是public)都可以對匿名用戶的非匿名用戶緩存成靜態頁面了。借用Boost模塊,我們實現緩存的生成,然后修改一下對應rewrite規則,即可讓登錄用戶也訪問靜態頁面了。

具體步驟如下,

1. 所有public頁面生成靜態頁面,并當內容有修改時更新靜態緩存。

2. 讓匿名用戶和普通登錄用戶都訪問靜態頁面。

3. 讓超級用戶,比如durpal管理員,不要訪問靜態頁面,直接運行drupal動態內容。

第一步,Boost模塊完全可以實現。第二和第三步,我們用一小段代碼,來標記用戶是否是管理員,這樣就可以在rewrite的規則中判斷是否需要返回靜態頁面。

首先,實現hook_user,以標記用戶。

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
 * Implementation of hook_user().
 */
function MODULE_user($op, &$edit, &$account, $category = NULL) {
  switch ($op) {
    case 'logout':
      if (_is_admin($account)) {
      	setcookie('DRUPAL_ADMIN', strval(0), time()-3600, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure') == '1');
        drupal_goto();
      }
      break;
 
    case 'login':
     if (_is_admin($account)) {
        //using it in rewrite rules for server
        setcookie('DRUPAL_ADMIN', strval($account->uid), time()+1800, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure') == '1');
      }
      break;
  }
}
 
function _is_admin($account) {
  $admin_roles = variable_get('admin_role_ids', $admin_roles);
  return array_intersect($admin_roles, array_keys($account->roles));
}

這樣,我們給超級用戶添加了一個cookie以標記其角色。
下來,我們在apache或者nginx中,修改一下rewrite rule就可以讓所有非DRUPAL_ADMIN使用靜態頁面了。
這里是Nginx的代碼部分

30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
###Nginx-BOOST
  set $boost "";
  set $boost_query "_";
 
  if ( $request_method = GET ) {
    set $boost G;
  }
  if ($http_cookie !~ "DRUPAL_ADMIN") {
    set $boost "${boost}D";
  }
  if ($query_string = "") {
    set $boost "${boost}Q";
  }
  if ( -f $document_root/cache/normal/$http_host$request_uri$boost_query$query_string.html ) {
    set $boost "${boost}F";
  }
  if ($boost = GDQF){
    rewrite ^.*$ /cache/normal/$http_host/$request_uri$boost_query$query_string.html break;
  }
  if ( -f $document_root/cache/perm/$http_host$request_uri$boost_query$query_string.css ) {
    set $boost "${boost}F";
  }
  if ($boost = GDQF){
    rewrite ^.*$ /cache/perm/$http_host/$request_uri$boost_query$query_string.css break;
  }
  if ( -f $document_root/cache/perm/$http_host$request_uri$boost_query$query_string.js ) {
    set $boost "${boost}F";
  }
  if ($boost = GDQF){
    rewrite ^.*$ /cache/perm/$http_host/$request_uri$boost_query$query_string.js break;
  }
  ###END-BOOST

在apache下面的重寫比較簡單,大家可以借鑒一下Nginx的重寫方式完成。主要也是判斷cookie,大致就是添加如下代碼:

1
  RewriteCond %{HTTP_COOKIE} !DRUPAL_ADMIN

詳細的,可以參考boost模塊的說明。
這樣我們基本就完成了Drupal對登錄用戶的緩存,按照2/8法則所述,我們用20%時間,提高了網站80%的性能。

最后附上Drupal網站的架構以及靜態頁面緩存和NFS的搭配使用示例圖,以供大家參考。

Boost-Drupal-NFS-Nginx

PHP/Drupal網站的經典架構模式 (drupal001.com)

其中web節點和fastcgi節點都可以水平擴展,NFS為各個服務器之間共享都存儲介質,不過需要監控內網都網絡IO,以防止產生瓶頸。

推薦新篇
《Drupal靜態頁面緩存利器-Boost模塊與Ajaxblocks模塊》
Drupal緩存 – Authcache模塊原理詳解
Authcache模塊高級篇-動態加載內容


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


, , , ,

評論:34

發表評論
  1. avatar
    回復 飄流客
    11/10/07

    靜態化確實不錯。
    請問博主,如果頁面更新比較快,這個也能用boost靜態化嗎?

    謝謝!

    • avatar
      回復 robbin
      11/10/10

      完全可以,就看更新和訪問的頻率了。比如1分鐘以上才有可能更新,而訪問每秒幾十次,那靜態緩存還是挺不錯的。
      以前做過一個論壇,用boost都可以,因此一般情況都可以了。

  2. avatar
    回復 schwinn elliptical machine reviews
    11/10/15

    這是確切信息我要找的,謝謝! Arron

  3. avatar
    回復 Lugir
    11/10/16

    以下兩篇是關于 Boost 的介紹和安裝流程,對于還不了解 Boost 的朋友應該會有所幫助。
    《Boost – 為網站提供靜態頁面緩存的性能提升利器》
    《使用 Boost 模塊為網站提供高性能靜態頁面緩存機制》

    還有,昨天聚會上的演講很精彩 :D

    • avatar
      回復 robbin
      11/10/16

      謝謝。有機會多交流一下。
      友情鏈接一下 :P

  4. avatar
    回復 水滴
    11/10/19

    強大??!

  5. avatar
    回復 Rita
    11/12/21

    強??!我頂一個!

  6. avatar
    回復 nathan
    11/12/26

    不錯很好, 大家都開始對性能感興趣了, 我也交流下, 可以在nginx裏這樣寫

      location / {
        rewrite ^/(.*)/$ /$1 permanent; # remove trailing slashes - disabled
        #try_files $uri @cache;
        try_files $uri @drupal;
        #if (!-e $request_filename) {
        #  rewrite  ^(.*)$  /index.php?q=$1  last;
        #  break;
        #}
      }
     
      location @cache {
        if ( $request_method !~ ^(GET|HEAD)$ ) {
            return 405;
        }
        if ($http_cookie ~ "DRUPAL_UID") {
            return 405;
        }
        error_page 405 = @drupal;
        add_header Expires "Tue, 24 Jan 1984 08:00:00 GMT";        
        add_header Cache-Control "must-revalidate, post-check=0, pre-check=0";
        add_header X-Header "Boost Citrus 1.9";               
        charset utf-8;
        try_files /cache/normal/$host${uri}_$args.html /cache/$host${uri}_$args.html @drupal;
      }
  7. avatar
    回復 nathan
    11/12/26

    用了code怎麼不行阿。。 從新發下, 高興, 這個網是不是你搭建的?
    location / {
    rewrite ^/(.*)/$ /$1 permanent; # remove trailing slashes – disabled
    #try_files $uri @cache;
    try_files $uri @drupal;
    #if (!-e $request_filename) {
    # rewrite ^(.*)$ /index.php?q=$1 last;
    # break;
    #}
    }

    location @cache {
    if ( $request_method !~ ^(GET|HEAD)$ ) {
    return 405;
    }
    if ($http_cookie ~ “DRUPAL_UID”) {
    return 405;
    }
    error_page 405 = @drupal;
    add_header Expires “Tue, 24 Jan 1984 08:00:00 GMT”;
    add_header Cache-Control “must-revalidate, post-check=0, pre-check=0″;
    add_header X-Header “Boost Citrus 1.9″;
    charset utf-8;
    try_files /cache/normal/$host${uri}_$args.html /cache/$host${uri}_$args.html @drupal;
    }

  8. avatar
    回復 Simon
    12/04/06

    非常感謝!
    Boost太厲害了,真是名副其實!我那放國外200毫秒延時的drupal網站裝了boost,第二次訪問同一頁就跟本機訪問速度一樣快,不知道到怎么回事,是在頁面頭部指定了本地緩存嗎?

    • avatar
      回復 robbin
      12/04/07

      不是,是生成了靜態頁面,所以對動態頁面,比如登錄用戶就不能直接使用了。當然用上面的方法是可以用的。

  9. avatar
    回復 haojay
    12/08/05

    請問這段代碼放在哪個文件,function MODULE_user($op, &$edit, &$account, $category = NULL) {…………..}

    • avatar
      回復 robbin
      12/08/05

      需要新建一個drupal模塊。
      MODULE 表示你新建的模塊的名字,查看:hook_user。

      • avatar
        回復 haojay
        12/08/06

        能否打包一個完整可用的模塊,在下不才已嘗試著獨立完成這個模塊到了現在(凌晨1點多),目前仍然系統白屏中。麻煩勞您貴手

        • avatar
          回復 robbin
          12/08/06

          這個其實一個hook就搞定了,hook_user就可以,代碼就是上面的。因為主要的還是要其他的修改比較多,比如修改boost、自定義代碼的ajax請求和刷新等,如果一個模塊能搞定,估計我早就開發了 :P

          有一個叫ajaxblock模塊,你可以參考一下。
          參考這篇文章:Drupal靜態頁面緩存利器-Boost模塊與Ajaxblocks模塊

  10. avatar
    回復 Raysmond
    12/09/09

    我去試試。

  11. avatar
    回復 Mick
    13/06/19

    此方法很棒!但是遇到有表單提交時會報錯,有沒有辦法解決呢?

    • avatar
      回復 robbin
      13/06/19

      不知道你說的是什么報錯?
      在我的印象中,有可能出現drupal form token的報錯,你可以用form_alter unset或者修改token,要么就改改這個form,不讓使用token,其他的應該不會有什么錯誤。
      或者把這個form的提交修改一下,用ajax post到某個drupal的callback進行數據處理也好。

      • avatar
        回復 Mick
        13/06/20

        我查詢了一下資料,應該是form_token的問題,您說的第一種方法指的是unset form_token,這方面我不了解,unset form_token會影響什麼嗎?

        • avatar
          回復 robbin
          13/06/20

          form token就是安全上的一些驗證,你做好自己的form檢查就好了,基本沒有什么安全隱患。
          unset掉一般情況form完全可以正常工作。

  12. avatar
    回復 baseball
    14/01/27

    您好:
    請問 “首先,實現hook_user,以標記用戶。” 中
    我要做的動作?
    1.於sites\all\modules\ 新增1個 ckadmin 目錄
    2.於ckadmin 目錄下,新增 ckadmin.module
    並 加入
    function ckadmin_user($op, &$edit, &$account, $category = NULL){}
    function _is_admin($account){…}

    3.這模組需要安裝,啟動嗎?
    4.apache或者nginx中,修改一下rewrite rule就可以讓所有非DRUPAL_ADMIN使用靜態頁面了。
    在APACHE 下,只需加入
    RewriteCond %{HTTP_COOKIE} !DRUPAL_ADMIN
    這一段嗎? 要加到哪邊?
    還是,也要加###Nginx-BOOST 區段的程式嗎?

    謝謝!

    • avatar
      回復 robbin
      14/01/28

      3,是的,必須的
      4,對, 重寫的規則里面。nginx或apache的url rewrite里

  13. avatar
    回復 臺灣菜鳥
    14/02/08

    老師請問
    RewriteCond %{HTTP_COOKIE} !DRUPAL_ADMIN這段程式碼能丟到.htaccess裡面嗎??

    下面這些程式碼能丟入template.php嗎??抱歉我剛碰不久
    /**
    * Implementation of hook_user().
    */
    function MODULE_user($op, &$edit, &$account, $category = NULL) {
    switch ($op) {
    case ‘logout’:
    if (_is_admin($account)) {
    setcookie(‘DRUPAL_ADMIN’, strval(0), time()-3600, ini_get(‘session.cookie_path’), ini_get(‘session.cookie_domain’), ini_get(‘session.cookie_secure’) == ’1′);
    drupal_goto();
    }
    break;

    case ‘login’:
    if (_is_admin($account)) {
    //using it in rewrite rules for server
    setcookie(‘DRUPAL_ADMIN’, strval($account->uid), time()+1800, ini_get(‘session.cookie_path’), ini_get(‘session.cookie_domain’), ini_get(‘session.cookie_secure’) == ’1′);
    }
    break;
    }
    }

    function _is_admin($account) {
    $admin_roles = variable_get(‘admin_role_ids’, $admin_roles);
    return array_intersect($admin_roles, array_keys($account->roles));
    }

  14. avatar
    回復 robbin
    14/02/12

    1. 可以。
    2. 不可以。

  15. avatar
    回復 臺灣菜鳥
    14/02/13

    老師謝謝^_^

  16. avatar
    回復 臺灣菜鳥
    14/02/13

    老師的網站教學真的太棒了,很多東西需要研讀,希望有一天也能跟老師依樣厲害^_^

    • avatar
      回復 robbin
      14/02/16

      重在參與,多交流,呵呵。

  17. avatar
    回復 sw
    14/04/29

    你好,我的站也是用drupal做的,現在在做百度的seo優化,但是網站只收錄首頁,內容頁面都沒有收錄,請問該如何解決呢?boost是不是有利于收錄???謝謝。

    • avatar
      回復 robbin
      14/04/29

      Boost不會影響你的SEO的,并且Boost有助于SEO,快。
      況且也是靜態化成HTML,你如果用.html后綴的話,可能還利于SEO。

      百度收錄本來就比較慢,你多引誘一下蜘蛛,有頻率的更新網站,多等等。

      • avatar
        回復 sw
        14/04/30

        我的站都有幾個月了,內容頁面一個不收錄。是不是設置方面有錯誤呢?還是有哪些模塊影響了百度收錄?能大概的說下嗎?還有您方便留下您的qq嗎?

        • avatar
          回復 robbin
          14/05/04

          多發一些原創性文章,交換幾個權重高的友情鏈接,再等等看吧。
          也不能太著急了。

  18. avatar
    回復 teng long
    15/07/28

    請問,url帶query string和不帶的都生產一樣的緩存,是什么問題?
    比如我有一個手機版的網站,url是http://example.com?mobile=true, 桌面版的就是http://example.com/,然后boost也生成了相應的兩個緩存:_.html和_mobile=true.html,但是這兩個緩存一模一樣,這樣會導致用戶手機觀看直接看到的是桌面的風格。
    謝謝

臺灣菜鳥 進行回復 取消回復

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


+ 五 = 7

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

引用:3

下面所列的是引用到本博客的鏈接
Drupal性能優化之-將Boost模塊用到極致 來自 Drupal與高性能網站架構
pingback 來自 讓豬去飛-漫談Drupal性能優化經驗貼 - 霉芽糖 2013 年 9 月 26 日

[...] 具體如何使用Boost模塊已經如何讓登錄用戶也使用Boost模塊,可以參考這篇文章,讓Drupal/Boost模塊發揮到極致。 Boost 模塊地址?http://drupal.org/project/boost [...]

pingback 來自 Drupal性能優化相關模塊,Memcache | 小馬加油 2014 年 1 月 15 日

[…] 具體如何使用Boost模塊已經如何讓登錄用戶也使用Boost模塊,可以參考這篇文章,讓Drupal/Boost模塊發揮到極致。 Boost 模塊地址?http://drupal.org/project/boost […]

pingback 來自 轉載 | Drupal性能優化實戰 | 逸軒小站 2014 年 12 月 26 日

[…] Drupal性能優化之-將Boost模塊用到極致 […]

頂部
四川时时彩投注平台