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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

帖子

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

[复制链接]
发表于 4-20-2012 21:39 | 显示全部楼层 |阅读模式
Boost模块是Drupal的一个静态页面缓存模块,效率非常之高,如果还不了解,请参考《让猪去飞-Drupal性能优化贴》,本文就使用Boost以及如何 hack该模块来打造高性能Drupal网站做简单介绍。
* U! @8 N5 i) W7 k1 O* g! W
1 T9 L6 U: s& k! D9 S7 H一般情况下,Boost模块适用于匿名访问多的Drupal站点,因为这会直接去访问事先建好的静态页面,效率很高,不需要进行数据库查询。但是在很多情况下,我们的网站需要用户登录,以登录用户的方式访问网站,但是,网站的很多内容其实和匿名用户看到的完全一样。0 L. C+ T# }8 J* q) S

0 j5 I0 {. r) ~5 x6 Z$ q' N举个例子,比如新浪博客,腾讯博客等。当用户登录之后和匿名用户看到的博文完全一样,唯一不同的就是上面的用户信息(topbar),也可以称之为顶栏。( n$ k% X6 ]8 i, v- g1 Y
  a8 B: ^, e1 r
------------|登录链接 | -----------|页面内容 |------------
; b% C  H; }" Z, R当用户登录之后,上面的顶栏信息就会变成用户名和用户的个人信息链接。如果仔细观察,会发现上面的顶栏不是立刻加载的。也就是说上面的内容是异步的,当整个网页加载之后,上面的信息通过ajax/flash/iframe等异步方式获取。
1 v. k' r' d& p
3 m# G$ M& v6 b+ e% e9 d: u所以,我们可以做这样一个结构的页面:把用户信息块用javascript脚本填充,其余部分均是静态内容,用户信息块在页面初始化的时候通过ajax方式动态加载,如果没有登录,显示登录连接;如果已经登录,则显示用户欢迎信息。
: e$ K- |: P6 \* f" R! `2 r* S5 Q7 x& o0 n
如此一来,所有public的页面(注意是public)都可以对匿名用户的非匿名用户缓存成静态页面了。借用Boost模块,我们实现缓存的生成,然后修改一下对应rewrite规则,即可让登录用户也访问静态页面了。
# n+ k) z0 [1 S1 x" X: o. A/ e6 a' Z
具体步骤如下,
4 }! [' P; S& [6 [' E; g
& Z+ o" _/ ?8 b, q3 a& H& P1. 所有public页面生成静态页面,并当内容有修改时更新静态缓存。
5 t+ ^2 F) U* k9 E
0 u' A" }$ z. ]! j; O/ H6 n2. 让匿名用户和普通登录用户都访问静态页面。0 e( E; Z1 _3 ?2 f

8 n8 N4 X; j/ J9 [4 S  S2 ^3. 让超级用户,比如durpal管理员,不要访问静态页面,直接运行drupal动态内容。& Y) J$ X; |' E/ `! d6 _3 m: a

  f5 T% w3 r0 R) c第一步,Boost模块完全可以实现。第二和第三步,我们用一小段代码,来标记用户是否是管理员,这样就可以在rewrite的规则中判断是否需要返回静态页面。" \& t* W# c  |9 K% D5 i

0 a2 Q( d2 h! |! h: u首先,实现hook_user,以标记用户。& N  `. F' g6 K+ g% P: E3 N
  f2 `# w& s$ o3 I3 B" 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));}
; _/ V; q% M6 e  J. F. H

' @# n- j: q5 G, ]: p) V# Z6 s9 [这样,我们给超级用户添加了一个cookie以标记其角色。4 z# H, g# N8 V) f0 t$ p
下来,我们在apache或者nginx中,修改一下rewrite rule就可以让所有非DRUPAL_ADMIN使用静态页面了。3 g+ S/ U) s% r: L! x0 ?! R
这里是Nginx的代码部分4 Y- ~8 H1 U+ l! i: F
: f: a5 _2 }, x3 [( _. H* ]
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

2 e* {# i5 |8 G7 Z
& e8 j6 M0 P4 j8 W+ z. r* t在apache下面的重写比较简单,大家可以借鉴一下Nginx的重写方式完成。主要也是判断cookie,大致就是添加如下代码:
4 J: M/ E* o: W" j* {$ b$ r2 U% o5 y) T. }, Q8 P
1
  RewriteCond %{HTTP_COOKIE} !DRUPAL_ADMIN
; U7 ]! y5 e' `: ~' Z- f7 Y6 A
% x& V2 G9 x3 ^4 }
详细的,可以参考boost模块的说明。这样我们基本就完成了Drupal对登录用户的缓存,按照2/8法则所述,我们用20%时间,提高了网站80%的性能。
' F+ q" C6 N# m7 ~最后附上Drupal网站的架构以及静态页面缓存和NFS的搭配使用示例图,以供大家参考& G- e6 |7 A5 u/ w3 n

7 Y4 g; Y! Y) S! m# |0 V& ^其中web节点和fastcgi节点都可以水平扩展,NFS为各个服务器之间共享都存储介质,不过需要监控内网都网络IO,以防止产生瓶颈。! F' L( E! F/ l, ~5 X
注1:推荐新篇 《Drupal静态页面缓存利器-Boost模块与Ajaxblocks模块》) W) ?, ^  Q/ g5 @' f7 ?! f

+ q3 _5 s1 r. g( S1 x. E6 }! z) R4 S' {1 j/ d, v3 d
/ _0 k2 B+ a5 a0 M2 F  H) a
声明: 本站所有文章欢迎转载,所有文章未说明,均属于原创,转载均请注明出处。 本文有效链接: http://www.drupal001.com/2011/09/drupal-boost-tips/ 版权所有: Drupal与高性能网站架构 http://www.drupal001.com
; C$ p+ W, q$ f3 ?! ^3 T& |4 k8 Q' T$ D' Z! c( [$ O

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

GMT+8, 4-30-2025 17:38 , Processed in 0.518447 second(s), 53 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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