主页 > Drupal | 服务器技术 > Drupal性能优化之-将Boost模块用到极致

Drupal性能优化之-将Boost模块用到极致

Boost模块是Drupal的一个静态页面缓存模块,效率非常之高,如果还不了解,请参考《让猪去飞-Drupal性能优化贴》,本文就使用Boost以及如何 hack该模块来打造高性能Drupal网站做简单介绍。

一般情况下,Boost模块适用于匿名访问多的Drupal站点,因为这会直接去访问事先建好的静态页面,效率很高,不需要进行数据库查询。但是在很多情况下,我们的网站需要用户登录,以登录用户的方式访问网站,但是,网站的很多内容其实和匿名用户看到的完全一样。

举个例子,比如新浪博客,腾讯博客等。当用户登录之后和匿名用户看到的博文完全一样,唯一不同的就是上面的用户信息(topbar),也可以称之为顶栏。

------------
|登录链接 |
 -----------
|页面内容 |
------------

当用户登录之后,上面的顶栏信息就会变成用户名和用户的个人信息链接。如果仔细观察,会发现上面的顶栏不是立刻加载的。也就是说上面的内容是异步的,当整个网页加载之后,上面的信息通过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,以防止产生瓶颈。

注1:推荐新篇 《Drupal静态页面缓存利器-Boost模块与Ajaxblocks模块》


声明: 本站所有文章欢迎转载,所有文章未说明,均属于原创,转载均请注明出处。
本文有效链接: http://www.drupal001.com/2011/09/drupal-boost-tips/
版权所有: Drupal与高性能网站架构 http://www.drupal001.com


, , ,

评论:13

发表评论
  1. 回复 飘流客
    11/10/07

    静态化确实不错。
    请问博主,如果页面更新比较快,这个也能用boost静态化吗?

    谢谢!

    • 回复 robbin
      11/10/10

      完全可以,就看更新和访问的频率了。比如1分钟以上才有可能更新,而访问每秒几十次,那静态缓存还是挺不错的。
      以前做过一个论坛,用boost都可以,因此一般情况都可以了。

  2. 回复 schwinn elliptical machine reviews
    11/10/15

    这是确切信息我要找的,谢谢! Arron

  3. 回复 Lugir
    11/10/16

    以下两篇是关于 Boost 的介绍和安装流程,对于还不了解 Boost 的朋友应该会有所帮助。
    《Boost – 为网站提供静态页面缓存的性能提升利器》
    《使用 Boost 模块为网站提供高性能静态页面缓存机制》

    还有,昨天聚会上的演讲很精彩 :D

    • 回复 robbin
      11/10/16

      谢谢。有机会多交流一下。
      友情链接一下 :P

  4. 回复 水滴
    11/10/19

    强大啊!

  5. 回复 Rita
    11/12/21

    强啊!我顶一个!

  6. 回复 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. 回复 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. 回复 Simon
    12/04/06

    非常感谢!
    Boost太厉害了,真是名副其实!我那放国外200毫秒延时的drupal网站装了boost,第二次访问同一页就跟本机访问速度一样快,不知道到怎么回事,是在页面头部指定了本地缓存吗?

    • 回复 robbin
      12/04/07

      不是,是生成了静态页面,所以对动态页面,比如登录用户就不能直接使用了。当然用上面的方法是可以用的。

发表评论

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

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

引用:0

下面所列的是引用到本博客的链接
Drupal性能优化之-将Boost模块用到极致 来自 Drupal与高性能网站架构
顶部