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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

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

[复制链接]
发表于 4-20-2012 21:39 | 显示全部楼层 |阅读模式
Boost模块是Drupal的一个静态页面缓存模块,效率非常之高,如果还不了解,请参考《让猪去飞-Drupal性能优化贴》,本文就使用Boost以及如何 hack该模块来打造高性能Drupal网站做简单介绍。
3 j& l% P1 H( d. K& d/ x
0 [' n; t; Q  X4 t一般情况下,Boost模块适用于匿名访问多的Drupal站点,因为这会直接去访问事先建好的静态页面,效率很高,不需要进行数据库查询。但是在很多情况下,我们的网站需要用户登录,以登录用户的方式访问网站,但是,网站的很多内容其实和匿名用户看到的完全一样。
6 w8 t- j2 ?% S0 G, K9 A# {3 B+ W* j" K9 j
举个例子,比如新浪博客,腾讯博客等。当用户登录之后和匿名用户看到的博文完全一样,唯一不同的就是上面的用户信息(topbar),也可以称之为顶栏。  |. ~2 D/ d- A9 U( G

3 l% g% ^; o2 u5 M: p------------|登录链接 | -----------|页面内容 |------------
! R0 D( Z! a- ]当用户登录之后,上面的顶栏信息就会变成用户名和用户的个人信息链接。如果仔细观察,会发现上面的顶栏不是立刻加载的。也就是说上面的内容是异步的,当整个网页加载之后,上面的信息通过ajax/flash/iframe等异步方式获取。9 T! a5 ?, _5 }+ ^; Q. v6 d

3 g% f- k% y( h- _9 a所以,我们可以做这样一个结构的页面:把用户信息块用javascript脚本填充,其余部分均是静态内容,用户信息块在页面初始化的时候通过ajax方式动态加载,如果没有登录,显示登录连接;如果已经登录,则显示用户欢迎信息。3 K+ J( t, g' V# y1 z  E
2 G. r5 U5 G; `
如此一来,所有public的页面(注意是public)都可以对匿名用户的非匿名用户缓存成静态页面了。借用Boost模块,我们实现缓存的生成,然后修改一下对应rewrite规则,即可让登录用户也访问静态页面了。
! q9 Q. O$ H# J8 K# `
0 c8 ]) H; t! @* n具体步骤如下,
( Z: Q) V" a8 M3 R# r& U8 l* d3 K  D, O% P* k- s! ]$ u
1. 所有public页面生成静态页面,并当内容有修改时更新静态缓存。) Y* w/ }" D8 F

  n8 G+ f) Y  e/ \3 [& a2. 让匿名用户和普通登录用户都访问静态页面。
% ?5 n7 M: q* G9 a8 J, j) B9 w/ l/ L* A; C  n# c" \
3. 让超级用户,比如durpal管理员,不要访问静态页面,直接运行drupal动态内容。
. q  B9 {* ?9 H, P8 K+ r: {" H
1 b" ]  U+ F% s" T/ ]1 C' A$ v, a第一步,Boost模块完全可以实现。第二和第三步,我们用一小段代码,来标记用户是否是管理员,这样就可以在rewrite的规则中判断是否需要返回静态页面。
- w* {+ @; d( r2 Z2 [3 W# r) i  B8 y$ ~0 k( d& s5 N
首先,实现hook_user,以标记用户。0 s  V; U# f4 }4 w  G- S$ x1 |
8 g3 d9 T7 g* l- g
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));}
: }8 ]; r0 q3 O0 ]5 ~$ W5 d$ A0 s
3 Z3 ?! j2 |$ ]2 m1 i
这样,我们给超级用户添加了一个cookie以标记其角色。; O. ^4 D3 v5 l4 g0 s5 R9 V
下来,我们在apache或者nginx中,修改一下rewrite rule就可以让所有非DRUPAL_ADMIN使用静态页面了。, G0 s/ J5 r( t2 ?/ A, C
这里是Nginx的代码部分
% _; S$ a$ n4 s4 f& y
9 z$ g$ ?& k; i. t: c+ G5 Y
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

# P- Y3 p+ x3 j& W: a- P0 m" Q9 d1 G' y2 \4 p7 `) D
在apache下面的重写比较简单,大家可以借鉴一下Nginx的重写方式完成。主要也是判断cookie,大致就是添加如下代码:' Y1 r* E* i; F6 U) q2 K. Z7 S

1 @9 n' ^; F) i
1
  RewriteCond %{HTTP_COOKIE} !DRUPAL_ADMIN

/ o% E" u7 ]/ c' Z7 v  n( n
8 j9 m3 {& P8 ?9 Z) |8 i3 R. w详细的,可以参考boost模块的说明。这样我们基本就完成了Drupal对登录用户的缓存,按照2/8法则所述,我们用20%时间,提高了网站80%的性能。
* v3 o/ `! z# O: S+ h# t) |$ p最后附上Drupal网站的架构以及静态页面缓存和NFS的搭配使用示例图,以供大家参考
- e+ l6 \. b* x$ [9 O; [
2 f7 O, \1 X. T其中web节点和fastcgi节点都可以水平扩展,NFS为各个服务器之间共享都存储介质,不过需要监控内网都网络IO,以防止产生瓶颈。
+ {# \, U( q0 ]) i1 \8 x/ N注1:推荐新篇 《Drupal静态页面缓存利器-Boost模块与Ajaxblocks模块》; J! O  \$ T" {  d! u( ~
7 `) i' `# z, X( m: \7 E

' G3 t% m" j6 B+ o0 V7 a7 P8 k$ t, B) X& C! @
声明: 本站所有文章欢迎转载,所有文章未说明,均属于原创,转载均请注明出处。 本文有效链接: http://www.drupal001.com/2011/09/drupal-boost-tips/ 版权所有: Drupal与高性能网站架构 http://www.drupal001.com3 X/ T) i" v. U! |* i& p) p
: L6 @/ t# o* U  f! j$ k

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

GMT+8, 6-15-2025 17:56 , Processed in 0.339943 second(s), 53 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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