国外设计欣赏网站 - DOOOOR.com

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

[Drupal优化/SEO/环境] Drupal性能优化之-将Boost模块用到极致

[复制链接]
发表于 4-20-2012 21:39 | 显示全部楼层 |阅读模式
Boost模块是Drupal的一个静态页面缓存模块,效率非常之高,如果还不了解,请参考《让猪去飞-Drupal性能优化贴》,本文就使用Boost以及如何 hack该模块来打造高性能Drupal网站做简单介绍。7 z7 ~! x6 W  H! a/ o. q
& I, X4 i* `9 }( e4 ~4 v$ O
一般情况下,Boost模块适用于匿名访问多的Drupal站点,因为这会直接去访问事先建好的静态页面,效率很高,不需要进行数据库查询。但是在很多情况下,我们的网站需要用户登录,以登录用户的方式访问网站,但是,网站的很多内容其实和匿名用户看到的完全一样。: e: j- ?+ u& B; D) O

" K; E7 e7 x8 C2 D" V* M4 C举个例子,比如新浪博客,腾讯博客等。当用户登录之后和匿名用户看到的博文完全一样,唯一不同的就是上面的用户信息(topbar),也可以称之为顶栏。
. U/ }* d0 P6 S) b2 _8 W. z1 _% U/ E* O5 U1 J
------------|登录链接 | -----------|页面内容 |------------5 x: W' h7 I2 c' M9 u8 M3 u  h
当用户登录之后,上面的顶栏信息就会变成用户名和用户的个人信息链接。如果仔细观察,会发现上面的顶栏不是立刻加载的。也就是说上面的内容是异步的,当整个网页加载之后,上面的信息通过ajax/flash/iframe等异步方式获取。3 o/ X& h& O% f6 ^, \

: [+ I% v( S; @; M- I8 \/ C所以,我们可以做这样一个结构的页面:把用户信息块用javascript脚本填充,其余部分均是静态内容,用户信息块在页面初始化的时候通过ajax方式动态加载,如果没有登录,显示登录连接;如果已经登录,则显示用户欢迎信息。- Q% }$ H3 `* J! c
' r+ S! C" _% N
如此一来,所有public的页面(注意是public)都可以对匿名用户的非匿名用户缓存成静态页面了。借用Boost模块,我们实现缓存的生成,然后修改一下对应rewrite规则,即可让登录用户也访问静态页面了。( a/ K$ ?4 Q% {; o8 j2 N8 U4 ?5 `
. F& u7 I/ |8 [" I1 w( Q1 |
具体步骤如下,
! W9 Y9 Q9 x8 e$ |5 Z( e  s* c
' C+ @* y4 J7 Z$ G9 g( Y' g1. 所有public页面生成静态页面,并当内容有修改时更新静态缓存。  [3 Q1 J/ h6 h6 S3 v

1 F1 J. {, h% e9 d$ h2 L2. 让匿名用户和普通登录用户都访问静态页面。
: `% M; \" z0 Z+ e
9 t: w2 E7 j  Z3. 让超级用户,比如durpal管理员,不要访问静态页面,直接运行drupal动态内容。% {& W1 C( A  t8 h8 ^

, s5 V& ?5 a0 r第一步,Boost模块完全可以实现。第二和第三步,我们用一小段代码,来标记用户是否是管理员,这样就可以在rewrite的规则中判断是否需要返回静态页面。
) [( N3 `! ?4 p, C! y6 D
* u' N* }3 G$ k& Z. y. m8 X: G首先,实现hook_user,以标记用户。
9 r2 {3 J8 ?' a" T9 `: t
& m! W; D; q8 {9 s1 T$ ?+ m: ^. Q# c
20212223242526272829303132333435363738394041424344
/** * 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));}

1 K' F% J( ?/ J- a3 j/ |' V
' C0 g) u' M8 _7 r! e, w0 _这样,我们给超级用户添加了一个cookie以标记其角色。
. A+ q0 s+ X/ U/ f& a下来,我们在apache或者nginx中,修改一下rewrite rule就可以让所有非DRUPAL_ADMIN使用静态页面了。7 x. v- G( y: D1 U
这里是Nginx的代码部分
7 {- ~: R( P2 x. q0 k7 O6 {* S. v# N
3031323334353637383940414243444546474849505152535455565758596061
###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

0 d  V+ E: m# ^7 S% E
% l4 }3 C$ `6 E) A6 p3 u在apache下面的重写比较简单,大家可以借鉴一下Nginx的重写方式完成。主要也是判断cookie,大致就是添加如下代码:; d2 h* v: \* Y; l4 ~

2 K$ O+ k8 L' Z& F$ Y8 D; T  V
1
  RewriteCond %{HTTP_COOKIE} !DRUPAL_ADMIN
; ?% C3 J6 }5 S$ ~; J) {; j

( i% N% `; `; N' t" K& @0 r详细的,可以参考boost模块的说明。这样我们基本就完成了Drupal对登录用户的缓存,按照2/8法则所述,我们用20%时间,提高了网站80%的性能。
! E& A( ?* Q9 R* d- o最后附上Drupal网站的架构以及静态页面缓存和NFS的搭配使用示例图,以供大家参考; h8 h+ m( ?2 D1 a5 b6 ~( v
, L* K" H& h- d' p
其中web节点和fastcgi节点都可以水平扩展,NFS为各个服务器之间共享都存储介质,不过需要监控内网都网络IO,以防止产生瓶颈。: `) O# O( ]& S, f* z# {
注1:推荐新篇 《Drupal静态页面缓存利器-Boost模块与Ajaxblocks模块》
7 p% N9 d! k$ F6 K7 y3 \8 q0 R* s5 W- ]: x, q+ G4 B+ E

" y- ?% f+ x! \( w8 ?4 l; a
1 @; D; t% ]6 w% b/ f- \声明: 本站所有文章欢迎转载,所有文章未说明,均属于原创,转载均请注明出处。 本文有效链接: http://www.drupal001.com/2011/09/drupal-boost-tips/ 版权所有: Drupal与高性能网站架构 http://www.drupal001.com
  x0 @9 [/ T+ U" {8 W5 ?, E; D
7 o7 ^5 C: f( x

|2011-2026-版权声明|平台(网站)公约|DOOOOR 设计网 ( 吉ICP备2022003869号 )

GMT+8, 5-1-2025 04:48 , Processed in 0.341359 second(s), 53 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表