主頁 > 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.tbdskt.live/2011/09/let-drupal-fly/
版權所有: Drupal與高性能網站架構 http://www.tbdskt.live


, , ,

評論: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 這個我還沒有試過 回頭去調試下玩玩

發表評論

電子郵件地址不會被公開。 必填項已用 * 標注


+ 六 = 12

您可以使用這些 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性能優化經驗貼》 […]

頂部
四川时时彩投注平台