主页 > 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.drupal001.com/2011/09/drupal-boost-tips/
版权所有: Drupal与高性能网站架构 http://www.drupal001.com


, , , ,

评论: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,但是这两个缓存一模一样,这样会导致用户手机观看直接看到的是桌面的风格。
    谢谢

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注


− 二 = 2

您可以使用这些 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模块用到极致 […]

顶部