1. /usr/local/webserver/mysql/scripts/mysql_install_db --basedir=/usr/local/webserver/mysql --datadir=/data0/mysql/data --user=mysql 

一、获取相关开源程序

  1、本文基本以源码编译为主,首先需要安装基础编译环境所需要的软件和库。本文安装CentOS系统时只安装最基础的包(安装时软件套件选择时只选了Server一项),下面的所需要的包可根据自己系统环境情况自行调整。

  a)、通过CentOS光盘安装(以光盘作为Yum源)

  1. mkdir /media/CentOS/  
  2. mount /dev/cdrom /media/CentOS/  
  3.    
  4. yum -y --disablerepo=\* --enablerepo=c5-media install gcc gcc-c++ autoconf \  
  5. libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 \  
  6. libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 \  
  7. bzip2-devel  ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel \  
  8. krb5 krb5-devel libidn libidn-devel openssl openssl-devel libtool  libtool-libs \  
  9. libevent-devel libevent openldap openldap-devel nss_ldap openldap-clients \  
  10. openldap-servers libtool-ltdl libtool-ltdl-devel bison 

b)、通过mirrors.163.com安装(以mirrors.163.com为Yum源)

 

  1. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup  
  2. wget http://mirrors.163.com/.help/CentOS5-Base-163.repo  
  3. yum makecache  
  4.    
  5. yum -y --enablerepo=c5-media install gcc gcc-c++ autoconf \  
  6. libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 \  
  7. libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 \  
  8. bzip2-devel  ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel \  
  9. krb5 krb5-devel libidn libidn-devel openssl openssl-devel libtool  libtool-libs \  
  10. libevent-devel libevent openldap openldap-devel nss_ldap openldap-clients \  
  11. openldap-servers libtool-ltdl libtool-ltdl-devel bison 

2、下载最新的Nginx、Mysql、PHP程序及相关库的源码包

 

  1. mkdir -p /data0/software  
  2. cd /data0/software  
  3.    
  4. wget http://nginx.org/download/nginx-1.0.0.tar.gz  
  5. wget http://cn.php.net/get/php-5.3.6.tar.gz/from/this/mirror  
  6. wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.11.tar.gz/from/http://mysql.ntu.edu.tw/  
  7. wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz  
  8. wget "http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&big_mirror=0"  
  9. wget "http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.8.tar.gz?modtime=1194463373&big_mirror=0"  
  10. wget http://pecl.php.net/get/memcache-2.2.6.tgz  
  11. wget "http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz?modtime=1175740843&big_mirror=0"  
  12. wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.12.tar.gz  
  13. wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2  
  14. wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz  
  15. wget ftp://gd.tuwien.ac.at/pub/graphics/ImageMagick/ImageMagick-6.6.9-5.tar.gz  
  16. wget http://pecl.php.net/get/imagick-3.0.0.tgz  
  17. wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz 

二、安装MySQL 5.5.11

  1、首先安装CMAKE(Mysql5.5.11已经采用CMAKE编译)

 

  1. tar zxvf cmake-2.8.4.tar.gz  
  2. cd cmake-2.8.4  
  3. ./configure --prefix=/usr  
  4. make  
  5. make install  
  6. cd .. 

2、安装MySQL 5.5.11

  a)新建一个用于运行MySQL的用户

 

  1. /usr/sbin/groupadd mysql  
  2. /usr/sbin/useradd -g mysql mysql   
  3.  

b)解包并编译安装MySQL

 

  1. tar xvf mysql-5.5.11.tar.gz   
  2. cd mysql-5.5.11  
  3.    
  4. cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/webserver/mysql/ \  
  5. -DMYSQL_DATADIR=/data0/mysql/data \  
  6. -DMYSQL_UNIX_ADDR=/data0/mysql/mysqld.sock \  
  7. -DWITH_INNOBASE_STORAGE_ENGINE=1 \  
  8. -DWITH_MYISAM_STORAGE_ENGINE=1 \  
  9. -DENABLED_LOCAL_INFILE=1 \  
  10. -DMYSQL_TCP_PORT=3306 \  
  11. -DWITH_EXTRA_CHARSETS:STRING=utf8,gbk \  
  12. -DDEFAULT_CHARSET=utf8 \  
  13. -DDEFAULT_COLLATION=utf8_general_ci \  
  14. -DMYSQL_UNIX_ADDR=/data0/mysql/mysql.sock \  
  15. -DWITH_DEBUG=0 \  
  16. -DWITH_READLINE=1 \  
  17. -DWITH_SSL=yes \  
  18. -DSYSCONFDIR=/data0/mysql  
  19.    
  20. make  
  21. make install  
  22. cd .. 

c)将MySQL安装目录的权限赋予mysql用户

 

  1. chmod +w /usr/local/webserver/mysql  
  2. chown -R mysql:mysql /usr/local/webserver/mysql 

d)创建MySQL数据库存放目录

 

  1. mkdir -p /data0/mysql/data/  
  2. mkdir -p /data0/mysql/binlog/  
  3. mkdir -p /data0/mysql/relaylog/  
  4. chown -R mysql:mysql /data0/mysql/ 

e)以mysql用户帐号的身份建立数据表

 

  1. /usr/local/webserver/mysql/scripts/mysql_install_db --basedir=/usr/local/webserver/mysql --datadir=/data0/mysql/data --user=mysql 

f )创建my.cnf配置文件

 

  1. vi /data0/mysql/my.cnf  
  2.    
  3. [client]  
  4. default-character-set=utf8 
  5. port    = 3306 
  6. socket  = /tmp/mysql.sock  
  7.    
  8. [mysqld]  
  9. character-set-server = utf8 
  10. replicate-ignore-db = mysql 
  11. replicate-ignore-db = test 
  12. replicate-ignore-db = information_schema 
  13. user    = mysql 
  14. port    = 3306 
  15. socket  = /tmp/mysql.sock  
  16. basedir = /usr/local/webserver/mysql  
  17. datadir = /data0/mysql/data  
  18. log-error = /data0/mysql/mysql_error.log  
  19. pid-file = /data0/mysql/mysql.pid  
  20. open_files_limit    = 10240 
  21. back_log = 600 
  22. max_connections = 5000 
  23. max_connect_errors = 6000 
  24. table_cache = 614 
  25. external-locking = FALSE 
  26. max_allowed_packet = 32M 
  27. sort_buffer_size = 1M 
  28. join_buffer_size = 1M 
  29. thread_cache_size = 300 
  30. #thread_concurrency = 8 
  31. query_cache_size = 512M 
  32. query_cache_limit = 2M 
  33. query_cache_min_res_unit = 2k 
  34. default-storage-engine = MyISAM 
  35. thread_stack = 192K 
  36. transaction_isolation = READ-COMMITTED  
  37. tmp_table_size = 246M 
  38. max_heap_table_size = 246M 
  39. long_query_time = 3 
  40. log-slave-updates  
  41. log-bin = /data0/mysql/binlog/binlog  
  42. binlog_cache_size = 4M 
  43. binlog_format = MIXED 
  44. max_binlog_cache_size = 8M 
  45. max_binlog_size = 1G 
  46. relay-log-index = /data0/mysql/relaylog/relaylog  
  47. relay-log-info-file = /data0/mysql/relaylog/relaylog  
  48. relay-log = /data0/mysql/relaylog/relaylog  
  49. expire_logs_days = 30 
  50. key_buffer_size = 256M 
  51. read_buffer_size = 1M 
  52. read_rnd_buffer_size = 16M 
  53. bulk_insert_buffer_size = 64M 
  54. myisam_sort_buffer_size = 128M 
  55. myisam_max_sort_file_size = 10G 
  56. myisam_repair_threads = 1 
  57. myisam_recover  
  58.    
  59. interactive_timeout = 120 
  60. wait_timeout = 120 
  61.    
  62. skip-name-resolve  
  63. slave-skip-errors = 1032,1062,126,1114,1146,1048,1396  
  64.    
  65. server-id = 1 
  66.    
  67. innodb_additional_mem_pool_size = 16M 
  68. innodb_buffer_pool_size = 512M 
  69. innodb_data_file_path = ibdata1:256M:autoextend  
  70. innodb_file_io_threads = 4 
  71. innodb_thread_concurrency = 8 
  72. innodb_flush_log_at_trx_commit = 2 
  73. innodb_log_buffer_size = 16M 
  74. innodb_log_file_size = 128M 
  75. innodb_log_files_in_group = 3 
  76. innodb_max_dirty_pages_pct = 90 
  77. innodb_lock_wait_timeout = 120 
  78. innodb_file_per_table = 0 
  79.    
  80. log-slow-queries = /data0/mysql/slow.log  
  81. long_query_time = 10 
  82. log-queries-not-using-indexes  
  83.    
  84. [mysqldump]  
  85. quick  
  86. max_allowed_packet = 32M   
  87.  

g)创建管理MySQL数据库的shell脚本(注:此处操作有点疑问,需 /usr/local/webserver/mysql/bin/mysqld_safe 启动mysql后,才能对该shell脚本正常使用)

 

  1. vi /data0/mysql/mysql  
  2.    
  3. #!/bin/bash  
  4.    
  5. mysql_username="admin" 
  6. mysql_password="000000" 
  7.    
  8. function_start_mysql()  
  9. {  
  10.     printf "Starting MySQL...\n"  
  11.     /bin/sh /usr/local/webserver/mysql/bin/mysqld_safe --defaults-file=/data0/mysql/my.cnf 2>&1 > /dev/null &  
  12. }  
  13.    
  14. function_stop_mysql()  
  15. {  
  16.     printf "Stoping MySQL...\n"  
  17.     /usr/local/webserver/mysql/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S /tmp/mysql.sock shutdown  
  18. }  
  19.    
  20. function_restart_mysql()  
  21. {  
  22.     printf "Restarting MySQL...\n"  
  23.     function_stop_mysql  
  24.     sleep 5  
  25.     function_start_mysql  
  26. }  
  27.    
  28. function_kill_mysql()  
  29. {  
  30.     kill -9 $(ps -ef|grep 'bin/mysqld_safe'|grep -v 'grep'|awk '{printf $2}')  
  31.     kill -9 $(ps -ef|grep 'libexec/mysqld'|grep -v 'grep'|awk '{printf $2}')  
  32. }  
  33.    
  34. if [ "$1" = "start" ]; then  
  35.     function_start_mysql  
  36. elif [ "$1" = "stop" ]; then  
  37.     function_stop_mysql  
  38. elif [ "$1" = "restart" ]; then  
  39. function_restart_mysql  
  40. elif [ "$1" = "kill" ]; then  
  41. function_kill_mysql  
  42. else  
  43.     printf "Usage: /data0/mysql/mysql {start|stop|restart|kill}\n"  
  44. fi 

赋予shell脚本可执行权限

 

  1. chmod +x /data0/mysql/mysql   
  2.  

h)测试Mysql的启动的关闭

  启动MySQL

 

  1. /data0/mysql/mysql start   
  2.  

通过命令行登录管理MySQL服务器(提示输入密码时直接回车,缺省的Mysql的root用户无密码)

 

  1. /usr/local/webserver/mysql/bin/mysql -u root -p -S /tmp/mysql.sock 

创建一个具有root权限的用户:admin,密码是:000000(用于上面建的管理脚本中的mysqladmin)

 

  1. GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' IDENTIFIED BY '000000';  
  2. GRANT ALL PRIVILEGES ON *.* TO 'admin'@'127.0.0.1' IDENTIFIED BY '000000'; 

停止MySQL:

 

  1. /data0/mysql/mysql stop   
  2.  

g)、设置libmysqlclient的软链,防止编译其它依赖Mysql软件时出现libmysqlclient.so.18: cannot open shared object file 的错误

  32位系统下的MYSQL客户端软链接

 

  1. ln -s /usr/local/webserver/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18   
  2.  

64位系统下的MYSQL客户端软链接

 

  1. ln -s /usr/local/webserver/mysql/lib/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18 

三、安装PHP 5.3.6(FastCGI模式)

  1、编译安装PHP 5.3.6所需的支持库

  libiconv(加强系统对支持字符编码转换的功能)

 

  1. tar zxvf libiconv-1.13.1.tar.gz  
  2. cd libiconv-1.13.1/  
  3. ./configure --prefix=/usr/local  
  4. make  
  5. make install  
  6. cd .. 

libmcrypt(加密算法库,PHP扩展mcrypt功能对此库有依耐关系,要使用mcrypt必须先安装此库)

 

  1. tar zxvf libmcrypt-2.5.8.tar.gz  
  2. cd libmcrypt-2.5.8  
  3. ./configure  
  4. make  
  5. make install  
  6. /sbin/ldconfig  
  7.    
  8. cd libltdl/  
  9. ./configure --enable-ltdl-install  
  10. make  
  11. make install  
  12. cd ../../ 

编译安装libltdl时可能会遇到的错误:

 

  1. /bin/sh ./libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c ltdl.c  
  2. mkdir .libs  
  3.  gcc -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -c ltdl.c  -fPIC -o .libs/ltdl.o  
  4.  gcc -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -c ltdl.c -o ltdl.o >/dev/null 2>&1  
  5. /bin/sh ./libtool --mode=link gcc  -g -O2  -o libltdl.la -rpath /usr/local/lib -no-undefined -version-info 4:0:1 ltdl.lo -ldl   
  6. ./libtool: line 3965: ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib ): command not found  
  7. ./libtool: line 3965: ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib ): command not found  
  8. ./libtool: line 3965: ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib ): command not found  
  9. ./libtool: line 3965: ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib ): command not found 

产生原因:源码包中LIBTOOL版本过低。

  解决方法:让编译时调用系统的LIBTOOL。修改Makefile文件,LIBTOOL=$(SHELL)$(top_builddir)/libtool 为LIBTOOL=$(SHELL) /usr/bin/libtool

建立libmcrypt相关库的软连接,为编译mcrypt作准备。因为mcrypt依赖libmcrypt。

  #如果是CENTOS 5.6(64位)

 

  1. ln -sf /usr/local/lib/libmcrypt.la /usr/lib64/libmcrypt.la  
  2. ln -sf /usr/local/lib/libmcrypt.so /usr/lib64/libmcrypt.so  
  3. ln -sf /usr/local/lib/libmcrypt.so.4 /usr/lib64/libmcrypt.so.4  
  4. ln -sf /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib64/libmcrypt.so.4.4.8  
  5. ln -sf /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config  
  6. ln -sf /usr/local/lib/libiconv.so.2 /usr/lib64/libiconv.so.2  
  7. ldconfig 

#如果是CENTOS 5.6(32位)

 

  1. ln -sf /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la  
  2. ln -sf /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so  
  3. ln -sf /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4  
  4. ln -sf /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8  
  5. ln -sf /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config  
  6. ln -sf /usr/local/lib/libiconv.so.2 /usr/lib/libiconv.so.2  
  7. ldconfig 

mhash(hash加密算法库)

 

  1. tar zxvf mhash-0.9.9.9.tar.gz  
  2. cd mhash-0.9.9.9  
  3. ./configure  
  4. make  
  5. make install  
  6. cd .. 

建立libmhash相关库的软连接,为编译mcrypt作准备。mcrypt也依赖libmhash。

  #如果是CENTOS 5.6(64位)

 

  1. ln -sf /usr/local/lib/libmhash.a /usr/lib64/libmhash.a  
  2. ln -sf /usr/local/lib/libmhash.la /usr/lib64/libmhash.la  
  3. ln -sf /usr/local/lib/libmhash.so /usr/lib64/libmhash.so  
  4. ln -sf /usr/local/lib/libmhash.so.2 /usr/lib64/libmhash.so.2  
  5. ln -sf /usr/local/lib/libmhash.so.2.0.1 /usr/lib64/libmhash.so.2.0.1  
  6. ldconfig 

#如果是CENTOS 5.6(32位)

 

  1. ln -sf /usr/local/lib/libmhash.a /usr/lib/libmhash.a  
  2. ln -sf /usr/local/lib/libmhash.la /usr/lib/libmhash.la  
  3. ln -sf /usr/local/lib/libmhash.so /usr/lib/libmhash.so  
  4. ln -sf /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2  
  5. ln -sf /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1  
  6. ldconfig 

 

  1. tar zxvf mcrypt-2.6.8.tar.gz  
  2. cd mcrypt-2.6.8/  
  3. /sbin/ldconfig  
  4. ./configure  
  5. make  
  6. make install  
  7. cd .. 

 ./configure时可能会报这个错:/bin/rm: cannot remove `libtoolT’: No such file or directory。

  解决方法:修改configure文件,删除$RM “$cfgfile”这一行(在19744行)。重新再运行./configure就可以了。

  看了下configure文件,其实可以忽略这个错。configure文件中cfgfile=”${ofile}T”定义的这里变量值是不存在的(${ofile}T的值为libtoolT),最后所以报错了。

  2、编译安装PHP 5.3.6(FastCGI模式)

  从PHP 5.3.3开始就已经集成了PHP-FPM,所以这里就不用再打PHP-FPM的补丁了。更多PHP-FPM相关资料可参考:什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?

 

  1. tar xvf php-5.3.6.tar.gz  
  2. cd php-5.3.6  
  3.    
  4. ./configure --prefix=/usr/local/webserver/php --with-config-file-path=/usr/local/webserver/php/etc \  
  5. --with-mysql=/usr/local/webserver/mysql --with-mysqli=/usr/local/webserver/mysql/bin/mysql_config \  
  6. --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib \  
  7. --with-libxml-dir=/usr --enable-xml --disable-rpath  --enable-safe-mode --enable-bcmath \  
  8. --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers \  
  9. --enable-mbregex  --enable-fpm  --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf \  
  10. --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-ldap --with-ldap-sasl --with-xmlrpc \  
  11. --enable-zip --enable-soap  
  12.    
  13. make ZEND_EXTRA_LIBS='-liconv' 
  14. make install  
  15. cd .. 

编译最后可能会提示:PEAR package PHP_Archive not installed: generated phar will require PHP’s phar extension be enabled.这说明没有安装PEAR。更多可参考:Pecl和Pear的区别和联系?

  解决方法:

  1、加入–without-pear参数,不安装PEAR。

  2、安装PHP后,再通过PHAR安装PEAR。

 

  1. wget  http://pear.php.net/go-pear.phar  
  2. /usr/local/webserver/php/bin/php go-pear.phar 

创建PHP的配置文件

 

  1. cp -f php.ini-production /usr/local/webserver/php/etc/php.ini 

3、编译安装PHP5扩展模块

  Memcache扩展

  Memcache是danga.com的一个开源项目,它是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的Hash表,能够用来存储各种格式的数据。可以类比于MySQL这样的服务,而PHP扩展的Memcache实际上是连接Memcache的方式。  

 

  1. tar xvf memcache-2.2.6.tgz  
  2. cd memcache-2.2.6  
  3. /usr/local/webserver/php/bin/phpize  
  4. ./configure --with-php-config=/usr/local/webserver/php/bin/php-config  
  5. make  
  6. make install  
  7. cd ../ 

eaccelerator加速器

  eaccelerator是一个自由开放源码PHP加速器,优化和动态内容缓存,提高了性能php脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎完全消除。 它还有对脚本起优化作用,以加快其执行效率。使您的PHP程序代码执效率能提高1-10倍;

 

  1. tar jxvf eaccelerator-0.9.6.1.tar.bz2  
  2. cd eaccelerator-0.9.6.1/  
  3. /usr/local/webserver/php/bin/phpize  
  4. ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/webserver/php/bin/php-config  
  5. make  
  6. make install  
  7. cd .. 

PDO_MYSQL
 
  PDO_MYSQL是一个驱动程序,它实现了PHP数据对象(PDO)的接口,以实现从PHP访问MySQL的3.x,4.x和5.x的数据库。

 

  1. tar zxvf PDO_MYSQL-1.0.2.tgz  
  2. cd PDO_MYSQL-1.0.2/  
  3. /usr/local/webserver/php/bin/phpize  
  4. ./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-pdo-mysql=/usr/local/webserver/mysql  
  5. make  
  6. make install  
  7. cd .. 

 ImageMagick

  ImageMagick是一套稳定的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件,包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等格式。

wget ftp://mirror.aarnet.edu.au/pub/p_w_picpathmagick/ImageMagick-6.6.9-7.tar.gz

  1. tar xvf ImageMagick-6.6.9-7.tar.gz  
  2. cd ImageMagick-6.6.9-5  
  3. ./configure  
  4. make  
  5. make install  
  6. cd .. 

 

Imagick

  Imagick(PHP的原生函数库)是一个功能强大的图像处理库,Imagick是PHP下针对ImageMagick这个强大软件包的API接口。Imagick依赖于ImageMagick。

 

  1. tar zxvf imagick-3.0.0.tgz  
  2. cd imagick-3.0.0/  
  3. /usr/local/webserver/php/bin/phpize  
  4. ./configure --with-php-config=/usr/local/webserver/php/bin/php-config  
  5. make  
  6. make install  
  7. cd .. 

4、修改PHP.INI

 

  1. sed -i 's#; extension_dir = "./"#extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/"\nextension = "memcache.so"\nextension = "pdo_mysql.so"\nextension = "imagick.so"\n#' /usr/local/webserver/php/etc/php.ini  
  2. sed -i "s#;always_populate_raw_post_data = On#always_populate_raw_post_data = On#g" /usr/local/webserver/php/etc/php.ini  
  3. sed -i "s#;cgi.fix_pathinfo=1#cgi.fix_pathinfo=0#g" /usr/local/webserver/php/etc/php.ini 

5、配置eAccelerator加速PHP:

  创建缓存存放目录

 

  1. mkdir -p /usr/local/webserver/eaccelerator_cache  
  2. vi /usr/local/webserver/php/etc/php.ini 

按shift+g键跳到配置文件的最末尾,加上以下配置信息:

 

  1. [eaccelerator]  
  2. zend_extension="/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/eaccelerator.so" 
  3. eaccelerator.shm_size="64" 
  4. eaccelerator.cache_dir="/usr/local/webserver/eaccelerator_cache" 
  5. eaccelerator.enable="1" 
  6. eaccelerator.optimizer="1" 
  7. eaccelerator.check_mtime="1" 
  8. eaccelerator.debug="0" 
  9. eaccelerator.filter="" 
  10. eaccelerator.shm_max="0" 
  11. eaccelerator.shm_ttl="3600" 
  12. eaccelerator.shm_prune_period="3600" 
  13. eaccelerator.shm_only="0" 
  14. eaccelerator.compress="1" 
  15. eaccelerator.compress_level="9" 

6、建立存放日志的目录

 

  1. mkdir -p /usr/local/webserver/php/logs   
  2.  

7、创建php-fpm配置文件

 

  1. vi  /usr/local/webserver/php/etc/php-fpm.conf  
  2.    
  3. [global]  
  4. pid = /usr/local/webserver/php/logs/php-fpm.pid  
  5. error_log = /usr/local/webserver/php/logs/php-fpm.log  
  6. log_level = notice 
  7. emergency_restart_threshold = 10 
  8. emergency_restart_interval = 1m 
  9. process_control_timeout = 5s 
  10. daemonize = yes 
  11. [www]  
  12. listen = 127.0.0.1:9000  
  13. listen.backlog = -1  
  14. listen.allowed_clients = 127.0.0.1  
  15. user = www 
  16. group = www 
  17. listen.mode=0666 
  18. pm = static 
  19. pm.max_children = 64 
  20. pm.start_servers = 20 
  21. pm.min_spare_servers = 5 
  22. pm.max_spare_servers = 35 
  23. pm.max_requests = 1024 
  24.    
  25. request_terminate_timeout = 0s 
  26. request_slowlog_timeout = 0s 
  27. slowlog = logs/slow.log  
  28. rlimit_files = 65535 
  29. rlimit_core = 0 
  30. chroot =  
  31. chdir =  
  32. catch_workers_output = yes 
  33. env[HOSTNAME] = $HOSTNAME  
  34. env[PATH] = /usr/local/bin:/usr/bin:/bin  
  35. env[TMP] = /tmp  
  36. env[TMPDIR] = /tmp  
  37. env[TEMP] = /tmp  
  38.    
  39. php_flag[display_errors] = off 

8、启动php-cgi进程

  启动前可先测试下php-fpm.conf的语法是否正确。如出现下面的提示,表示没有问题。

 

  1. /usr/local/webserver/php/sbin/php-fpm -t  
  2. [18-Apr-2011 19:53:51] NOTICE: configuration file /usr/local/webserver/php/etc/php-fpm.conf test is successful   

启动php-cgi进程后,监听的是127.0.0.1的9000端口,进程数为64(如果服务器内存小于3GB,可以只开启64个进程),用户为www。

 

  1. /usr/local/webserver/php/sbin/php-fpm 

注:运行php-fpm前,记得先建立www用户,不然运行后会报错。因为PHP-FPM配置文件中是用www来运行的。

  四、安装Nginx 1.0.0

  1、创建相关用户和目录

  创建www用户和组,以及供blog和www两个虚拟主机使用的目录:

 

  1. /usr/sbin/groupadd www  
  2. /usr/sbin/useradd -g www www  
  3. mkdir -p /data0/htdocs/blog  
  4. chmod +w /data0/htdocs/blog  
  5. chown -R www:www /data0/htdocs/blog  
  6. mkdir -p /data0/htdocs/www  
  7. chmod +w /data0/htdocs/www  
  8. chown -R www:www /data0/htdocs/www   
  9.  

创建Nginx日志目录

 

  1. mkdir -p /data1/logs  
  2. chmod +w /data1/logs  
  3. chown -R www:www /data1/logs   
  4.  

 2、安装Nginx所需的pcre库

 

  1. tar zxvf pcre-8.12.tar.gz  
  2. cd pcre-8.12/  
  3. ./configure  
  4. make && make install  
  5. cd .. 

3、安装Nginx

 

  1. tar xvf nginx-1.0.0.tar.gz  
  2. cd nginx-1.0.0/  
  3. ./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module  
  4. make && make install  
  5. cd .. 

4、创建Nginx配置文件

  在/usr/local/webserver/nginx/conf/目录中创建nginx.conf文件:

 

  1. rm -f /usr/local/webserver/nginx/conf/nginx.conf  
  2. vi /usr/local/webserver/nginx/conf/nginx.conf  
  3.    
  4.   输入以下内容:  
  5.    
  6. user  www www;  
  7.    
  8. worker_processes 8;  
  9.    
  10. error_log  /data1/logs/nginx_error.log  crit;  
  11.    
  12. pid        /usr/local/webserver/nginx/nginx.pid;  
  13.    
  14. #Specifies the value for maximum file descriptors that can be opened by this process.  
  15.    
  16. worker_rlimit_nofile 65535;  
  17.    
  18. events  
  19. {  
  20.   use epoll;  
  21.   worker_connections 65535;  
  22. }  
  23.    
  24. http  
  25. {  
  26.   include       mime.types;  
  27.   default_type  application/octet-stream;  
  28.    
  29.   #charset  gb2312;  
  30.    
  31.   server_names_hash_bucket_size 128;  
  32.   client_header_buffer_size 32k;  
  33.   large_client_header_buffers 4 32k;  
  34.   client_max_body_size 8m;  
  35.    
  36.   sendfile on;  
  37.   tcp_nopush     on;  
  38.    
  39.   keepalive_timeout 60;  
  40.   tcp_nodelay on;  
  41.    
  42.   fastcgi_connect_timeout 300;  
  43.   fastcgi_send_timeout 300;  
  44.   fastcgi_read_timeout 300;  
  45.   fastcgi_buffer_size 64k;  
  46.   fastcgi_buffers 4 64k;  
  47.   fastcgi_busy_buffers_size 128k;  
  48.   fastcgi_temp_file_write_size 128k;  
  49.    
  50.   gzip on;  
  51.   gzip_min_length  1k;  
  52.   gzip_buffers     4 16k;  
  53.   gzip_http_version 1.0;  
  54.   gzip_comp_level 2;  
  55.   gzip_types       text/plain application/x-javascript text/css application/xml;  
  56.   gzip_vary on;  
  57.    
  58.   #limit_zone  crawler  $binary_remote_addr  10m;  
  59.    
  60.   server  
  61.   {  
  62.     listen       8080;  
  63.     server_name  192.168.1.106;  
  64.     index index.html index.htm index.php;  
  65.     root  /data0/htdocs/blog;  
  66.    
  67.     #limit_conn   crawler  20;      
  68.    
  69.     location ~ .*\.(php|php5)?$  
  70.     {        
  71.       #fastcgi_pass  unix:/tmp/php-cgi.sock;  
  72.       fastcgi_pass  127.0.0.1:9000;  
  73.       fastcgi_index index.php;  
  74.       include fcgi.conf;  
  75.     }  
  76.    
  77.     location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$  
  78.     {  
  79.       expires      30d;  
  80.     }  
  81.    
  82.     location ~ .*\.(js|css)?$  
  83.     {  
  84.       expires      1h;  
  85.     }      
  86.    
  87.     log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '  
  88.               '$status $body_bytes_sent "$http_referer" '  
  89.               '"$http_user_agent" $http_x_forwarded_for';  
  90.     access_log  /data1/logs/access_blog.log  access;  
  91.       }  
  92.    
  93.   server  
  94.   {  
  95.     listen       80;  
  96.     server_name  192.168.1.106;  
  97.     index index.html index.htm index.php;  
  98.     root  /data0/htdocs/www;  
  99.    
  100.     location ~ .*\.(php|php5)?$  
  101.     {        
  102.       #fastcgi_pass  unix:/tmp/php-cgi.sock;  
  103.       fastcgi_pass  127.0.0.1:9000;  
  104.       fastcgi_index index.php;  
  105.       include fcgi.conf;  
  106.     }  
  107.    
  108.     log_format  wwwlogs  '$remote_addr - $remote_user [$time_local] "$request" '  
  109.                '$status $body_bytes_sent "$http_referer" '  
  110.                '"$http_user_agent" $http_x_forwarded_for';  
  111.     access_log  /data1/logs/access_www.log  wwwlogs;  
  112.   }  
  113.    
  114.   server  
  115.   {  
  116.     listen  8888;  
  117.     server_name  192.168.1.106;  
  118.    
  119.     location / {  
  120.     stub_status on;  
  121.     access_log   off;  
  122.     }  
  123.   }  

5、创建fcgi.conf文件

  在/usr/local/webserver/nginx/conf/目录中创建fcgi.conf文件:

 

  1. vi /usr/local/webserver/nginx/conf/fcgi.conf  
  2.    
  3.   输入以下内容  
  4.    
  5. fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;  
  6. fastcgi_param  SERVER_SOFTWARE    nginx;  
  7.    
  8. fastcgi_param  QUERY_STRING       $query_string;  
  9. fastcgi_param  REQUEST_METHOD     $request_method;  
  10. fastcgi_param  CONTENT_TYPE       $content_type;  
  11. fastcgi_param  CONTENT_LENGTH     $content_length;  
  12.    
  13. fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;  
  14. fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;  
  15. fastcgi_param  REQUEST_URI        $request_uri;  
  16. fastcgi_param  DOCUMENT_URI       $document_uri;  
  17. fastcgi_param  DOCUMENT_ROOT      $document_root;  
  18. fastcgi_param  SERVER_PROTOCOL    $server_protocol;  
  19.    
  20. fastcgi_param  REMOTE_ADDR        $remote_addr;  
  21. fastcgi_param  REMOTE_PORT        $remote_port;  
  22. fastcgi_param  SERVER_ADDR        $server_addr;  
  23. fastcgi_param  SERVER_PORT        $server_port;  
  24. fastcgi_param  SERVER_NAME        $server_name;  
  25.    
  26. # PHP only, required if PHP was built with --enable-force-cgi-redirect  
  27. fastcgi_param  REDIRECT_STATUS    200; 

6、启动Nginx

  检查Nginx配置是否正确,出现以下类似信息表示配置正确。

 

  1. /usr/local/webserver/nginx/sbin/nginx -t  
  2. nginx: the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok  
  3. nginx: configuration file /usr/local/webserver/nginx/conf/nginx.conf test is successful   
  4.  

设置可打开文件数并启动Nginx

 

  1. ulimit -SHn 65535  
  2. /usr/local/webserver/nginx/sbin/nginx 

7、配置开机自动启动Nginx + PHP

  在/etc/rc.local末尾增加以下内容:

 

  1. vi /etc/rc.local  
  2. ulimit -SHn 65535  
  3. /usr/local/webserver/php/sbin/php-fpm  
  4. /usr/local/webserver/nginx/sbin/nginx   
  5.  

8、测试是否支持php

 

  1. cd /data0/htdocs/www/  
  2. echo "<?php phpinfo(); ?>">phpinfo.php  

浏览http://ip/phpinfo.php,可以正常看到php的相关信息,扩展支持情况。

  五、优化Linux内核参数

  在/etc/sysctl.conf末尾增加以下内容(可根据服务器实际情况进行调整)

 

  1. vi /etc/sysctl.conf  
  2.    
  3. # Add  
  4. net.ipv4.tcp_max_syn_backlog = 65536 
  5. net.core.netdev_max_backlog =  32768 
  6. net.core.somaxconn = 32768 
  7.    
  8. net.core.wmem_default = 8388608 
  9. net.core.rmem_default = 8388608 
  10. net.core.rmem_max = 16777216 
  11. net.core.wmem_max = 16777216 
  12.    
  13. net.ipv4.tcp_timestamps = 0 
  14. net.ipv4.tcp_synack_retries = 2 
  15. net.ipv4.tcp_syn_retries = 2 
  16.    
  17. net.ipv4.tcp_tw_recycle = 1 
  18. net.ipv4.tcp_tw_reuse = 1 
  19.    
  20. net.ipv4.tcp_mem = 94500000 915000000 927000000  
  21. net.ipv4.tcp_max_orphans = 3276800 
  22. net.ipv4.ip_local_port_range = 1024  65535  
  23. #net.ipv4.ip_conntrack_max = 10000 

各内核参数含义

  net.ipv4.tcp_max_syn_backlog

  记录的那些尚未收到客户端确认信息的连接请求的最大值。对于超过128M内存的系统而言,缺省值是1024,低于128M小内存的系统则是128。

  SYN Flood攻击利用TCP协议散布握手的缺陷,伪造虚假源IP地址发送大量TCP-SYN半打开连接到目标系统,最终导致目标系统Socket队列资源耗尽而无法接受新的连接。为了应付这种攻击,现代Unix系统中普遍采用多连接队列处理的方式来缓冲(而不是解决)这种攻击,是用一个基本队列处理正常的完全连接应用(Connect()和Accept() ),是用另一个队列单独存放半打开连接。

  这种双队列处理方式和其他一些系统内核措施(例如Syn-Cookies/Caches)联合应用时,能够比较有效的缓解小规模的SYN Flood攻击(事实证明<1000p/s)加大SYN队列长度可以容纳更多等待连接的网络连接数,一般遭受SYN Flood攻击的网站,都存在大量SYN_RECV状态,所以调大tcp_max_syn_backlog值能增加抵抗syn攻击的能力。

  net.core.netdev_max_backlog

  每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

  net.core.somaxconn

  调整系统同时发起并发TCP连接数,可能需要提高连接储备值,以应对大量突发入局连接请求的情况。 如果同时接收到大量连接请求,使用较大的值会提高受支持的暂挂连接的数量,从而可减少连接失败的数量。大的侦听队列对防止DDoS攻击也会有所帮助。挂起请求的最大数量默认是128。

  net.core.wmem_default

  该参数指定了发送套接字缓冲区大小的缺省值(以字节为单位)

  net.core.rmem_default

  该参数指定了接收套接字缓冲区大小的缺省值(以字节为单位)

  net.core.rmem_max

  该参数指定了接收套接字缓冲区大小的最大值(以字节为单位)

  net.core.wmem_max

  该参数指定了发送套接字缓冲区大小的最大值(以字节为单位)

net.ipv4.tcp_timestamps

  Timestamps可以防范那些伪造的sequence号码。一条1G的宽带线路或许会重遇到带out-of-line数值的旧sequence号码(假如它是由于上次产生的)。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉,以提高性能。

  net.ipv4.tcp_synack_retries

  对于远端的连接请求SYN,内核会发送SYN+ACK数据报,以确认收到上一个SYN连接请求包。这是所谓的三次握手(threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的SYN+ACK数目。不应该大于255,默认值是5,对应于180秒左右时间。(可以根据tcp_syn_retries来决定这个值)

  net.ipv4.tcp_syn_retries

  对于一个新建连接,内核要发送多少个SYN连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)

  net.ipv4.tcp_tw_recycle

  表示开启TCP连接中TIME-WAIT Sockets的快速回收,默认为0,表示关闭。

  net.ipv4.tcp_tw_reuse

  表示开启重用,允许将TIME-WAIT Sockets重新用于新的TCP连接,默认为0,表示关闭。这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助。

  net.ipv4.tcp_mem

  tcp_mem有3个INTEGER变量:low, pressure, high

  low:当TCP使用了低于该值的内存页面数时,TCP没有内存压力,TCP不会考虑释放内存。(理想情况下,这个值应与指定给tcp_wmem的第2个值相匹配。这第2个值表明,最大页面大小乘以最大并发请求数除以页大小 (131072*300/4096)

  pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。(理想情况下这个值应该是TCP可以使用的总缓冲区大小的最大值(204800*300/4096)

  high:允许所有TCP Sockets用于排队缓冲数据报的页面量。如果超过这个值,TCP连接将被拒绝,这就是为什么不要令其过于保守(512000*300/4096)的原因了。在这种情况下,提供的价值很大,它能处理很多连接,是所预期的2.5倍;或者使现有连接能够传输2.5倍的数据。

  一般情况下这些值是在系统启动时根据系统内存数量计算得到的。

  net.ipv4.tcp_max_orphans

  系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的DoS攻击﹐千万不要依赖这个或是人为的降低这个限制

  net.ipv4.ip_local_port_range

  将系统对本地端口范围限制设置为1024~65000之间

  net.ipv4.ip_conntrack_max = 10000

  设置系统对最大跟踪的TCP连接数的限制(CentOS 5.6无此参数)

  使配置立即生效:

 

  1. /sbin/sysctl -p 

六、用Webbench进行简单的压力测试

  Webbench是有名的网站压力测试工具。Webbench支持多平台,FreeBSD、Linux、Windows都可以使用。Webbench最多可以模拟3万个并发连接去测试网站的负载能力。
  
  1、Webbench安装

 

  1. wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz  
  2. tar zxvf webbench-1.5.tar.gz  
  3. cd webbench-1.5  
  4. make && make install 

在编译webbench的时候可能会出现下面类似的错误:

ctags *.c
/bin/sh: ctags: command not found
make: [tags] Error 127 (ignored)

  解决方法:由于是缺少ctags组件,安装后即可。

yum -y –disablerepo=\* –enablerepo=c5-media install ctags

或者下载ctags 安装wget http://prdownloads.sourceforge.net/ctags/ctags-5.8.tar.gz 

 

  1. tar –zxvf ctags-5.8.tar.gz   
  2.  
  3. cd ctags-5.8   
  4.  
  5. ./configure  
  6.  
  7. make  
  8.  
  9. make install  
  10.  

2、使用:

 

  1. webbench -c 500 -t 30 http://192.168.1.106/phpinfo.php   
  2.  

参数说明:-c表示并发数,-t表示时间(秒)

  3、测试结果示例:

Webbench – Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://192.168.1.106/phpinfo.php
500 clients, running 30 sec.

Speed=39824 pages/min, 37963652 bytes/sec.
Requests: 19912 susceed, 0 failed.

  七、在不停止Nginx服务的情况下平滑变更Nginx配置

  平滑重启

  1、对于Nginx 0.8.x以上的版本,平滑重启Nginx配置非常简单,执行以下命令即可:

 

  1. /usr/local/webserver/nginx/sbin/nginx -s reload 

2、对于Nginx 0.8.x之前的版本,按照以下步骤进行即可。

 

  1. kill -HUP `cat /usr/local/webserver/nginx/nginx.pid` 

八、Nginx支持的信号

  1、TERM,INT 快速关闭
  2、QUIT 从容关闭
  3、HUP 平滑重启,重新加载配置文件
  4、USR1 重新打开日志文件,在切割日志时用处比较大
  5、USR2 平滑升级可执行程序
  6、WINCH 从容关闭工作进程

九、编写每天定时切割Nginx日志的脚本

  方法一

  1、创建脚本/usr/local/webserver/nginx/sbin/cut_nginx_log.sh

 

  1. vi /usr/local/webserver/nginx/sbin/cut_nginx_log.sh  
  2.    
  3. #!/bin/bash  
  4. # This script run at 00:00  
  5.    
  6. # The Nginx logs path  
  7. logs_path="/data1/logs/" 
  8.    
  9. mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/  
  10. mv ${logs_path}access_blog.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_blog_$(date -d "yesterday" +"%Y%m%d").log  
  11. mv ${logs_path}access_www.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_www_$(date -d "yesterday" +"%Y%m%d").log  
  12. kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid` 

2、设置crontab,每天凌晨00:00切割nginx访问日志

 

  1. crontab -e 

输入以下内容:

 

  1. 00 00 * * * /bin/bash  /usr/local/webserver/nginx/sbin/cut_nginx_log.sh   
  2.  

方法二

  1、创建脚本/usr/local/webserver/nginx/sbin/cut_nginx_log.sh

 

  1. vi /usr/local/webserver/nginx/sbin/cut_nginx_log.sh  
  2.    
  3. #!/bin/bash  
  4.    
  5. nginx_app=/usr/local/webserver/nginx/sbin/nginx  #设置nginx的目录  
  6. logs_dir=/data1/logs/ #log目录  
  7. bak_dir=/data1/logs/bak/ #log备份目录  
  8.    
  9. #先把现有的log文件挪到备份目录临时存放  
  10. cd $logs_dir  
  11. echo “moving logs”  
  12. /bin/mv *.log $bak_dir  
  13. sleep 3  
  14.    
  15. #重建nginx log  
  16. echo “rebuild logs”  
  17. echo “$nginx_app -s reopen”  
  18. $nginx_app -s reopen  
  19.    
  20. #按天打包log文件  
  21. echo “begining of tar”  
  22. cd $bak_dir  
  23. /bin/tar czf `date +%Y%m%d`.tgz *.log  
  24.    
  25. #删除备份目录的临时文件  
  26. echo “rm logs”  
  27. rm -f *.log  
  28. echo “done” 

2、设置crontab,每天凌晨00:00切割nginx访问日志

 

  1. crontab -e 

输入以下内容:

 

  1. 00 00 * * * /bin/bash  /usr/local/webserver/nginx/sbin/cut_nginx_log.sh>/dev/null 2>&1 

方法三:

  1、这种方法是通过logrotate实现的,先创建logrotate所需的脚本。

 

  1. /data1/logs/*.log {  
  2.         daily  
  3.         missingok  
  4.         rotate 7  
  5.         compress  
  6.         delaycompress  
  7.         notifempty  
  8.         create 640 root adm  
  9.         sharedscripts  
  10.         postrotate  
  11.                 [ ! -f /usr/local/webserver/nginx/nginx.pid ] || kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`  
  12.         endscript  

2、手工测试下看能否正常轮询

 

  1. logrotate -vf  /etc/logrotate.conf 

十、参考文档

  http://www.google.com
  http://blog.s135.com/nginx_php_v6/  
  http://www.cnblogs.com/vicowong/archive/2011/01/27/1946220.html
  http://vladgh.com/blog/install-nginx-and-php-533-php-fpm-mysql-and-apc
  http://bbs.365master.com/viewthread.php?tid=133043
  http://www.imx365.net/blog/weblog-20565-1.html
  http://blog.csdn.net/radkitty/archive/2008/10/02/3009522.aspx
  http://www.cnblogs.com/OnlyXP/archive/2007/09/29/911269.html
  http://www.newphp.net/contents/90-some-options-of-optimization-for-kernel
  http://www.lvtao.net/showarticle.php?articleid=987&p=5
  http://www.cnblogs.com/sunth/archive/2010/12/07/1899168.html
  http://www.cnblogs.com/vicowong/archive/2011/01/27/1946220.html
  http://os.51cto.com/art/200912/167478.htm