Boost模块是Drupal的一个静态页面缓存模块,效率非常之高,如果还不了解,请参考《让猪去飞-Drupal性能优化贴》,本文就使用Boost以及如何 hack该模块来打造高性能Drupal网站做简单介绍。: T* A' v0 p( C# a; W) _3 |
: r9 W0 k5 O, ^8 W一般情况下,Boost模块适用于匿名访问多的Drupal站点,因为这会直接去访问事先建好的静态页面,效率很高,不需要进行数据库查询。但是在很多情况下,我们的网站需要用户登录,以登录用户的方式访问网站,但是,网站的很多内容其实和匿名用户看到的完全一样。' Q' Y* a! H. j( w& g
3 {% z' R. h, A) e& J
举个例子,比如新浪博客,腾讯博客等。当用户登录之后和匿名用户看到的博文完全一样,唯一不同的就是上面的用户信息(topbar),也可以称之为顶栏。
& m4 A5 j! W3 D5 e8 x
' I; D Q* E* v# ~7 N------------|登录链接 | -----------|页面内容 |------------/ {% q `% g, ~% L# I' g8 E
当用户登录之后,上面的顶栏信息就会变成用户名和用户的个人信息链接。如果仔细观察,会发现上面的顶栏不是立刻加载的。也就是说上面的内容是异步的,当整个网页加载之后,上面的信息通过ajax/flash/iframe等异步方式获取。
@, H6 p. P5 O6 U
- G' e1 b! B& J9 ~5 F+ L1 e所以,我们可以做这样一个结构的页面:把用户信息块用javascript脚本填充,其余部分均是静态内容,用户信息块在页面初始化的时候通过ajax方式动态加载,如果没有登录,显示登录连接;如果已经登录,则显示用户欢迎信息。0 A7 [& z' i2 Y: `$ y
$ \0 \" u5 n9 f2 j& t1 V' n0 D; Z
如此一来,所有public的页面(注意是public)都可以对匿名用户的非匿名用户缓存成静态页面了。借用Boost模块,我们实现缓存的生成,然后修改一下对应rewrite规则,即可让登录用户也访问静态页面了。
7 ^* J, H9 F1 H& \8 a1 U
, V5 R; A8 Q9 h7 J- g$ e具体步骤如下,
4 |, H- I0 H& J( V( z l* p0 |7 _& n9 u/ Z
1. 所有public页面生成静态页面,并当内容有修改时更新静态缓存。
2 ^7 _' S4 ?: [4 C) R
" d7 K; W l5 ?4 d6 p: ^2. 让匿名用户和普通登录用户都访问静态页面。4 f- q) H5 t% }2 y
, ` I( L. ~% \, e* |3. 让超级用户,比如durpal管理员,不要访问静态页面,直接运行drupal动态内容。4 G8 ]3 _- s, @( r. \5 q' x
: H+ P. P" ?$ R) a) L4 d1 {第一步,Boost模块完全可以实现。第二和第三步,我们用一小段代码,来标记用户是否是管理员,这样就可以在rewrite的规则中判断是否需要返回静态页面。
6 I/ F& O0 f' ?; `! k6 E+ U, \' W0 K$ }7 s
首先,实现hook_user,以标记用户。
6 O: j5 l) y) ]/ G+ H: U# J& u8 ?6 q7 ?5 y; |6 @7 Z" {
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));} |
* I3 X/ y- P4 @; z9 ?# ?
, C+ {4 r0 A, F) [3 f4 V" [这样,我们给超级用户添加了一个cookie以标记其角色。
% X* k0 B$ a! P( _2 F2 Z: ]下来,我们在apache或者nginx中,修改一下rewrite rule就可以让所有非DRUPAL_ADMIN使用静态页面了。
7 Z6 C. b; b, D& k6 |5 @# n! d- Q: D4 p这里是Nginx的代码部分/ B! T' w( B1 a7 _
8 m( Y0 K$ }* C' _9 d
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 |
: k2 ^+ I3 [4 p) W6 Z
5 s2 F f3 x! e在apache下面的重写比较简单,大家可以借鉴一下Nginx的重写方式完成。主要也是判断cookie,大致就是添加如下代码: t- a1 f" T5 Y; h3 p- v* f
2 H3 y, Q' d8 Z }6 b1 | RewriteCond %{HTTP_COOKIE} !DRUPAL_ADMIN |
* A$ [4 M2 {% O0 g4 k _' q) t5 a
8 _1 ?7 E- S: @/ `% V' j/ R( P
详细的,可以参考boost模块的说明。这样我们基本就完成了Drupal对登录用户的缓存,按照2/8法则所述,我们用20%时间,提高了网站80%的性能。* y6 G- g! H f* |" x) q2 ]
最后附上Drupal网站的架构以及静态页面缓存和NFS的搭配使用示例图,以供大家参考- c) n0 p: @- N( P- \: a3 X. O G

. f7 u" I. _0 _4 m其中web节点和fastcgi节点都可以水平扩展,NFS为各个服务器之间共享都存储介质,不过需要监控内网都网络IO,以防止产生瓶颈。
3 j4 g; j/ X4 W, W注1:推荐新篇 《Drupal静态页面缓存利器-Boost模块与Ajaxblocks模块》) [7 k( g9 a7 Q8 R
. ~3 F0 J# n& ]6 l. U
' K4 o l8 s+ V: o0 n3 P5 y; @
& C% f$ o/ `5 t. |声明: 本站所有文章欢迎转载,所有文章未说明,均属于原创,转载均请注明出处。 本文有效链接: http://www.drupal001.com/2011/09/drupal-boost-tips/ 版权所有: Drupal与高性能网站架构 http://www.drupal001.com- l- W% u/ p( j# D9 e
& O; u6 ?/ S# w" k- V/ j |