主页 > Drupal | 服务器技术 > 让猪去飞-漫谈Drupal性能优化经验贴

让猪去飞-漫谈Drupal性能优化经验贴

PDF版本

drupal性能问题一直以来都是Drupaler们最大的难题,在平台设计方面,可扩展性和高性能从来都是难以平衡的问题。
Drupal平台本身的优劣本文不做讨论,就Drupal的性能问题,这里列几个实战总结经验,以供参考。

1. 使用静态页面缓存(Boost模块)
静态页面是最快的,没有之一!
因此静态页面缓存是最佳选择,尽量把页面动态的部分独立处理,用ajax/iframe调用,整个页面是静态页面,部分用ajax刷新(当然用shtml也可以)。 Boost模块经过稍微调整和修改,可以设置某些Roles(比如一般认证用户)也读取静态缓存(apache/nginx的rewrite),并且可以很好的工作在Apache和Nginx上面,并使某些角色,比如管理员,不读取静态页面。对于一个普通网站,90%以上的都属于普通认证用户和匿名用户,因此,经过这样修改可以大大提高性能。

具体如何使用Boost模块已经如何让登录用户也使用Boost模块,可以参考这篇文章,让Drupal/Boost模块发挥到极致
Boost 模块地址 http://drupal.org/project/boost

Ajax建议使用Drupal的高效Ajax Callback模块 High-performance JavaScript callback handler

这里给出了nginx的boost设置文件,仅供参考。

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  ###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. opcode
Drupal 需要load相当多的PHP文件,所以opcode是必须的,MUST!
实践证明eAccelerator比APC和xCache好一点,注意:APC的某个版本在NFS环境下有bug,不能正确缓存,所以建议使用eAccelerator。

3. Memcache memcache是LAMP平台居家必备的缓存服务器
最好多个memcache集群使用,Memcache可以使用Drupal的Memcache模块,支持多个集成。

注意:当Memcache不在本机,那么需要占用网络带宽,并且Drupal的缓存数据比较大,比如theme信息,node-type信息等,再每页请求都要加载,这样读取cache的流量就非常大。

比如,每次读取cache 500K,那么1千次访问就需要占用流量500M,这个流量相当不小。建议把这部分不经常修改的cache保存在本机某个cache目录下面,可以把cache目录mount到内存上面,这样会大大提高缓存的效率。

memcache模块的主页 http://drupal.org/project/memcache

此外,如果一台主机上有多个memcache实例,参考了网上的一片文章,http://www.sunchis.com/html/db/memcached/2011/0909/361.html
自定义启动和停止的脚本,不必再kill和逐个启动memcache。

50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/sh 
# 
# Startup script for the server of memcached 
# 
# processname: memcached 
# pidfile: /etc/memcached/memcached.pid 
# logfile: /etc/memcached/memcached_log.txt 
# memcached_home: /etc/memcached 
# chkconfig: 35 21 79 
# description: Start and stop memcached Service 
 
MEMCACHED_HOME=/etc/memcached 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MEMCACHED_HOME/lib 
 
# Source function library 
. /etc/rc.d/init.d/functions 
 
RETVAL=0 
 
prog="memcached" 
basedir=/etc/memcached 
cmd=${basedir}/bin/memcached 
 
# 绑定侦听的IP地址 
ipaddr=`/sbin/ifconfig eth0|sed -n '2p'|awk '{print $2}'|cut -c 6-30` 
 
# 设置memcached启动参数 
port=11210                     # 服务端口基数,使用11210 + i的方式 
threads=4                      # 在服务器上运行memcached进程的最大进程数 
user=`whoami`                  # 运行程序的用户身份 
max_memory=128                 # default: 64M | 最大使用内存 
max_simul_conn=1024            # default: 1024 | 最大同时连接数 
#maxcon=51200 
#growth_factor=1.3             # default: 1.25 | 块大小增长因子 
#thread_num=6                  # default: 4 
#verbose="-vv"                 # 查看详细启动信息 
#bind_protocol=binary          # ascii, binary, or auto (default) 
start() { 
    echo -n $"Starting $prog: " 
    for((i=1;i

4. 使用CDN
要想使页面加载较快,必须使用CDN。(原理请查阅相关文档)
CDN Drupal有两个模块 Parallel 和 CDN,Parallel比较简单,推荐使用。但是Parallel目前已经并入CDN模块,所以还是得要下载CDN模块 http://drupal.org/project/cdn

5. 数据库结构合理、分表、分库

首先告诫一点:不要使用content-profile模块
该模块把profile信息存储成一种你node-type,问题是这样会导致node表比较大,但是profile的node除了uid之外其他都是无用信息。加入一个网站有上百万、千万用户,再有很多文章(node),这样node表将会非常大,尤其是一个user有很多profile的node,比如5个,这样node表就会有5倍的user数量的node。导致查询node、user都没法处理,views之类的工具更是没法用,因为views生成的SQL将会非常慢。

把user相关表分出去,到独立的数据库,这样可以方便其他站点,比如子站,共享用户信息。

对于大型网站,不推荐使用太多第三方模块,因为大多模块都是基于node,如果跟node没有关系的独立数据,建议自己写模块来读写,这样方便数据的拆分和优化,又减轻了node表的压力。所以再使用模块前,必须了解模块的工作机制。

6. 服务器

Web服务器建议,推荐使用HAProxy/varnish作为前端代理,Nginx作为Web服务器,php-fpm作为FastCGI处理PHP程序,当然也可以使用Apache作为PHP后端处理,但是不推荐使用apache作为Web节点服务器。

Drupal有一个Varnish相关的模块 http://drupal.org/project/varnish

7. 使用Drupal的Pressflow版本

Drupal本身没有太多考虑性能的优化,Pressflow是一个专门针对Drupal的优化版本,包括支持Mysql Master-Slave等等。对于大型网站,选择Pressflow是必须的。

http://pressflow.org/

8. 其他相关模块

 

模块

版本

缓存类型

效率

匿名 / 注册

更新状态

1. Boost 5.x, 6.x 对匿名用户直接调用文件缓存 非常高 匿名用户 6.xyes
5.xno
2. Javascript Aggregator 5.x, 6.x 文件 中等 全部 Yes
3. Cache Router 5.x-beta, 6.x-rc, 7.x-beta 数据库、文件、PHP opcode和内存 根据设置从中等到非常高 根据设置 Yes
4. CDN 6.x, 7.x 服务器 全部 Yes
5. CacheExclude 5.x, 6.x 数据库 中等 匿名用户 Yes
6. CSS Gzip 6.x 文件 中等 全部 Yes
7. Memcache API and Integration 5.x, 6.x 内存 大部分匿名用户 Yes
8. Block Cache 5.x-dev 数据库 中等 全部 Yes
9. Block Cache Alter 6.x 数据库 中等 全部 Yes
10. Term Lower Name 6.x 数据库 中等 全部 更新较少
11. Path Cache 6.x 根据设置 中等 全部 更新较少
12. Advanced Cache 5.x, 6.x-dev 数据库 中等 大部分注册用户 Yes
13. Authcache 6.x-rc 数据库、文件、PHP opcode和内存 根据设置从中等到非常高 全部匿名用户,大多数注册用户 Yes
14. Previous/Next API 6.x-dev 数据库 中等 全部 较少更新
15. fastpath_fscache 4.7.x-dev, 5.x-rc, 6.x-dev 对匿名用户调用文件缓存(避开db) High 匿名用户 Yes
16.Varnish 6.x-dev, 7.x-dev Reverse proxy(虚拟内存) 非常高 全部注册用户,大部分匿名用户 测试阶段
17. High-performance JavaScript callback handler 6.x, 7.x Javascript Callback 中等 全部 Yes
18. Apache solr 6.x-dev, 7.x-dev 全文检索 主要对于搜索页面的提高 Yes

最后一提的是关于性能分析
PHP中debug和性能分析推荐使用xdebug和xhprof,两个模块都可以详细都列出函数执行都步骤以及时间,相比较而言xhprof比较轻量级一下,可以下载drupal的xhprof模块来配合使用,效果更加~

相关链接:

Performance and scalability modules Drupal性能优化相关模块列表
利用缓存提高Drupal扩展性
实战Nginx:取代Apache的高性能Web服务器 – 张宴

最新文章推荐:
Drupal性能优化模块介绍
Drupal性能优化拾遗


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


, , ,

评论:8

发表评论
  1. avatar
    回复 猪猪跑
    11/10/07

    博主的分析挺实用。
    学习了,请问有邮件吗?可以讨论一下 :P

  2. avatar
    回复 drupal学习站
    11/10/15

    请问楼主能分享一下性能监控方面的经验吗?
    即使提高了,也需要相关数据的检测,这样才有说服力。
    谢谢了~

  3. avatar
    回复 Aven
    12/02/15

    楼主所说的很有道理 但是覆盖到一些CMS类型的网站 Drupal最强大的地方在于CMS 针对CMS我认为还是 mongodb 或者是 nginx + phpfpm 效果更佳

    • avatar
      回复 robbin
      12/02/15

      mongoDB确实更胜一筹。不过PHP/Drupal站点,一般还是会选择MySQL,毕竟MySQL可以满足大多数需求。
      nginx+phpfpm确实是经典组合,另外个人认为
      varnish+apache也是不错的组合 :P

      • avatar
        回复 Aven
        12/02/16

        是的 对于一些个人的站点 memcache+ boost已经足够使用了
        mongoDB可以将cache system 放入mongoDB中

        D7中的wbapi就是使用这样的逻辑
        varnish+apache 这个我还没有试过 回头去调试下玩玩

发表评论

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


8 + 一 =

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

引用:1

下面所列的是引用到本博客的链接
让猪去飞-漫谈Drupal性能优化经验贴 来自 Drupal与高性能网站架构
pingback 来自 转载 | Drupal性能优化实战 | 逸轩小站 2014 年 12 月 26 日

[…] 《让猪去飞-漫谈Drupal性能优化经验贴》 […]

顶部