WEB平台架构之:LAMP(Linux+Apache+MySQL+PHP)
 
 从业界来看,最主流的web平台架构就当属LAMP了。LAMP架构可以说是一切web平台的基础架构,所有一切的所谓大型架构无非就是通过一些负载均衡技术,集群技术,缓存技术等结合LAMP平台
组合而成以便来满足现实生产环境中的需求。因此很有必要聊一聊LAMP平台架构的搭建。本文会对LAMP平台相对性的聊一聊其搭建过程,根据个人的知识知无不说,更多的技术将会陆续整理成博客文章。我的要求没那么多,笨蛋的技术,只求看文章的人,都能白手起家,构建平台。

环境说明:
 OS:CentOS6.5x65
 hostname:test1.lxm.com
 ip:10.0.10.11
 software:/root/soft
  apr-1.5.0.tar.gz
  apr-util-1.5.3.tar.gz
  httpd-2.4.6.tar.gz
  mysql-5.5.38.tar.gz
  php-5.5.16.tar.bz2
  libmcrypt-2.5.7.tar.gz
  mhash-0.9.9.tar.gz
  pcre-8.35.tar.gz
  openssl-1.0.1i.tar.gz
  xcache-3.1.0.tar.gz
  imagick-3.1.2.tgz
  ImageMagick-6.8.0-4.tar.gz
  
  
  
 software installation path:/usr/local
 
注:本实验环境为单机环境,所有的操作都是在一台机器上完成,这也是早期的单机架构。所谓分布式架构无非就是将这些在一台上提供的服务分成多台单独提供服务,然后通过各自的接口整合起来共同运作而已。 
 其次本实验中,关闭了iptables和selinux,如果你的环境中没有关闭,请自行关闭,以便造成不必要的错误(而你又不会排错,哈哈)
 
 
一:httpd服务搭建
 安装httpd软件,通常会一并安装apr-util apr pcre 和openssl。其中apr-util apr 这两个提供了httpd的运行环境,说白了是httpd程序运行的虚拟机环境,可以类比tomcat的jvm环境。
因此针对httpd软件的升级通常也要考虑到apr运行环境的升级.pcre 提供正则表达式的功能,openssl提供https的功能,这两个在LNMP中已经提及。

注:各位不要指望我把原理说得头头是道啊,某个软件的详细原理请各位自行看官方文档。。。。。。我只是提出各位需要知道的重点内容。。。。
 
1.安装apr
#cd /root/soft
#tar -zxvf apr-1.5.0.tar.gz
#cd apr-1.5.0
#mkdir /usr/local/apr
#./configure --prefix=/usr/local/apr/
 configure 如果成功会出现下面的内容:
configure: creating ./config.status
config.status: creating Makefile
config.status: creating include/apr.h
config.status: creating build/apr_rules.mk
config.status: creating build/pkg/pkginfo
config.status: creating apr-1-config
config.status: creating apr.pc
config.status: creating test/Makefile
config.status: creating test/internal/Makefile
config.status: creating include/arch/unix/apr_private.h
config.status: executing libtool commands
rm: cannot remove `libtoolT': No such file or directory
config.status: executing default commands

 矣,这个地方发现好像有个错误:rm: cannot remove `libtoolT': No such file or directory ..这个错误真实个诟病,有两种解决方法,一是忽略它,而是打开configure文件,
将其中$RM $cfgfile 这一行注释掉,然后重新configure即可。

#make && make install
#make clean

如果上面的步骤,没有出现什么错误,则表示apr已经安装成功。。。

2.安装apr-util
#cd /root/soft
#tar -zxvf apr-util-1.5.3.tar.gz
#cd apr-util-1.5.3
#mkdir /usr/local/apr-util
#./configure --prefix=/usr/local/apr-util/ --with-apr=/usr/local/apr/
#make && make install
#make clean

执行上面的命令,如果没有什么错误产生,则表示apr-util安装成功..


3.安装pcre
#cd /root/soft/
#tar -zxvf pcre-8.35.tar.gz
#cd pcre-8.35
#mkdir /usr/local/pcre
#./configure --prefix=/usr/local/pcre/
#make && make install
#make clean

执行上面的步骤,如果没有什么错误产生,则表示pcre已经安装成功...

不过我要给各位看下configure之后给出的信息:
pcre-8.35 configuration summary:

    Install prefix .................. : /usr/local/pcre
    C preprocessor .................. : gcc -E
    C compiler ...................... : gcc
    C++ preprocessor ................ : g++ -E
    C++ compiler .................... : g++
    Linker .......................... : /usr/bin/ld -m elf_x86_64
    C preprocessor flags ............ :
    C compiler flags ................ : -g -O2 -fvisibility=hidden
    C++ compiler flags .............. : -O2 -fvisibility=hidden -fvisibility-inlines-hidden
    Linker flags .................... :
    Extra libraries ................. :

    Build 8 bit pcre library ........ : yes
    Build 16 bit pcre library ....... : no
    Build 32 bit pcre library ....... : no
    Build C++ library ............... : yes
    Enable JIT compiling support .... : no
    Enable UTF-8/16/32 support ...... : no
    Unicode properties .............. : no
    Newline char/sequence ........... : lf
    \R matches only ANYCRLF ......... : no
    EBCDIC coding ................... : no
    EBCDIC code for NL .............. : n/a
    Rebuild char tables ............. : no
    Use stack recursion ............. : yes
    POSIX mem threshold ............. : 10
    Internal link size .............. : 2
    Nested parentheses limit ........ : 250
    Match limit ..................... : 10000000
    Match limit recursion ........... : MATCH_LIMIT
    Build shared libs ............... : yes
    Build static libs ............... : yes
    Use JIT in pcregrep ............. : no
    Buffer size for pcregrep ........ : 20480
    Link pcregrep with libz ......... : no
    Link pcregrep with libbz2 ....... : no
    Link pcretest with libedit ...... : no
    Link pcretest with libreadline .. : no
    Valgrind support ................ : no
    Code coverage ................... : no
 
上面就是configure之后给出的信息,在这里可以看出有很多pcre的功能都是no,没有开启的状态,如果你需要更强的正则功能,你可以考虑开启某些功能。。。。但通常情况下,默认就够了。

 

4.安装openssl
#cd /root/soft
#tar -zxvf openssl-1.0.1i.tar.gz
#cd openssl-1.0.1i
#mkdir /usr/local/openssl
#./config -fPIC --prefix=/usr/local/openssl enable-shared   //注意:这里是config 不是configure
#make && make install
#make clean

执行上面的步骤,如果没有什么错误产生,表示openssl已经安装成功。。。。。


5.安装httpd
#cd /root/soft
#tar -zxvf httpd-2.4.6.tar.gz
#cd httpd-2.4.6
# CFLAGS="-m64 -O3" CXXFLAGS="-m64 -O3"  ./configure --prefix=/usr/local/apache24  --enable-rewrite --enable-shared=max  --enable-so  --enable-cache --enable-file-cache --enable-static-support  --enable-forward --enable-modules=all --enable-vhost-alias  --enable-mods-shared=all --enable-include --enable-headers --enable-deflate --enable-mpms-shared=all --with-mpm=prefork --with-apr=/usr/local/apr/ --with-apr-util=/usr/local/apr-util/ --with-pcre=/usr/local/pcre/ --enable-expires --enable-ssl --with-ssl=/usr/local/openssl
#make && make install
#make clean

如果上面没什么错误,就表示httpd已经安装成功。。。。其次httpd的编译参数也有很多,但是大多数功能已经包括。对于其编译参数找个时间聊一聊。。。。

在新版的httpd软件中,平时大家安装时很可能会报下面的错误:
/usr/bin/ld: /usr/local/openssl/lib/libssl.a(s3_srvr.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/usr/local/openssl/lib/libssl.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
make[4]: *** [mod_ssl.la] Error 1
make[4]: Leaving directory `/root/soft/httpd-2.4.6/modules/ssl'
make[3]: *** [shared-build-recursive] Error 1
make[3]: Leaving directory `/root/soft/httpd-2.4.6/modules/ssl'
make[2]: *** [shared-build-recursive] Error 1
make[2]: Leaving directory `/root/soft/httpd-2.4.6/modules'
make[1]: *** [shared-build-recursive] Error 1
make[1]: Leaving directory `/root/soft/httpd-2.4.6'
make: *** [all-recursive] Error 1

从上面的信息可见,包了ssl的错误,扒拉扒拉一大推,就是说找不到符号连接,让我们用-fPIC重新编译一下openssl.所以一开始编译时,就要使用我上面的编译参数

注意注意:到这里我突然有个想法,这装来装去是不是有人会问,为什么要编译安装啊,为什么要选择这个版本啊? 我只想说,你想怎么装怎么装,只要你能用起来就行,至于版本的选择,
你要想用低版本不升级我无所谓。。。。

注意:这里的编译参数中pcre 和openssl都是安装的目录,而不是源码目录,这个和nginx是有大大的区别的。。。


测试:
 软件安装成功后,就要测试一下,httpd是否能够提供正常的web服务。。。
[root@test1 /]# cd /usr/local/apache24/bin/
[root@test1 bin]# ./apachectl -k start  //启动httpd服务
AH00557: httpd: apr_sockaddr_info_get() failed for test1.lxm.com
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message 

啊,第一次启动,怎么了?不少人被吓住了!看报错信息,说apr没有获得为test1.lxm.com的sockaddr的地址信息,然后又报了一个说不能够决定服务器的域名。此时查看一下httpd进程是否启动:
[root@test1 bin]# ps aux | grep httpd
root      2547  0.0  0.4  76680  2064 ?        Ss   14:54   0:00 /usr/local/apache24/bin/httpd -k start
daemon    2548  0.0  0.2  76680  1404 ?        S    14:54   0:00 /usr/local/apache24/bin/httpd -k start
daemon    2549  0.0  0.2  76680  1404 ?        S    14:54   0:00 /usr/local/apache24/bin/httpd -k start
daemon    2550  0.0  0.2  76680  1404 ?        S    14:54   0:00 /usr/local/apache24/bin/httpd -k start
daemon    2551  0.0  0.2  76680  1404 ?        S    14:54   0:00 /usr/local/apache24/bin/httpd -k start
daemon    2552  0.0  0.2  76680  1404 ?        S    14:54   0:00 /usr/local/apache24/bin/httpd -k start
root      2556  0.0  0.1 103244   848 pts/0    S+   14:54   0:00 grep httpd
[root@test1 bin]#

通过上面的信息,可知httpd进程还成功启动了。到此,就要考虑为什么会出现这个错误呢?首先我们知道sockaddr其实就是socket地址,而test1.lxm.com是我的主机名,在sockaddr地址通信中主机名肯定是要解析成ip地址的,在看下面的一条报错,说没有找到域名,可以使用配置文件中的ServerName来设置,而在httpd.conf配置文件中默认ServerName选项是被注释掉的。此时就要考虑会不会是在apache2.4版本中,因为没有设置默认的域名而导致报错呢?想到这,赶紧去修改httpd.conf配置文件
#vim /usr/local/apache24/conf/httpd.conf
#ServerName
www.example.com:80
ServerName 10.0.10.11:80
修改上面的信息后,再次启动测试:
[root@test1 bin]# pkill httpd
[root@test1 bin]#./apachectl -k start  //发现此时不报错了。。
[root@test1 bin]# ps aux | grep httpd
root      2522  0.0  0.3  72456  1916 ?        Ss   14:51   0:00 /usr/local/apache24/bin/httpd -k start
daemon    2523  0.0  0.2  72456  1372 ?        S    14:51   0:00 /usr/local/apache24/bin/httpd -k start
daemon    2524  0.0  0.2  72456  1372 ?        S    14:51   0:00 /usr/local/apache24/bin/httpd -k start
daemon    2525  0.0  0.2  72456  1372 ?        S    14:51   0:00 /usr/local/apache24/bin/httpd -k start
daemon    2526  0.0  0.2  72456  1372 ?        S    14:51   0:00 /usr/local/apache24/bin/httpd -k start
daemon    2527  0.0  0.2  72456  1372 ?        S    14:51   0:00 /usr/local/apache24/bin/httpd -k start
root      2529  0.0  0.1 103244   848 pts/0    S+   14:51   0:00 grep httpd
[root@test1 bin]#

通过上面的再次测试,发现错误已经解决,就是因为httpd进程在启动时没有提供默认的套接字信息,因而此时apr就会去使用主机名来当作域名,但是如果出现了该错误,说明/etc/hosts文件中肯定没有绑定主机名的解析,所以报错了. 由此可知另外一种解决办法就是修改/etc/hosts文件,绑定主机名到ip地址的解析。

到此,一个完整的排错就结束了。。没那么复杂吧。。。


服务启动之后,就要测试提供服务的能力了:
[root@test1 htdocs]# ls
index.html
[root@test1 htdocs]# pwd
/usr/local/apache24/htdocs
[root@test1 htdocs]# links --dump
http://10.0.10.11
                                   It works!
[root@test1 htdocs]#

由上面的信息可知,apache的测试页面已经能够正常显示。因此一个httpd服务就安装搭建完成。。。

 


二:MySQL服务搭建
1.安装MySQL
#yum -y install zlib-devel openssl-devel ncurses-devel bison//因为下面编译mysql用到了这几个开发文件,所以必须安装好
#cd /root/soft/
#tar -zxvf mysql-5.5.38.tar.gz
#cd mysql-5.5.38
#mkdir /usr/local/mysql
#useradd -s /sbin/nologin mysql -M
#cmake
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_DATADIR=/data/mysqldata (注:这里在企业环境中,通常会用一个单独的目录来存放mysql的数据文件,如果业务小可以不用,默认放在/var/lib/mysql下面)
-DSYSCONFDIR=/etc
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock   
-DENABLED_LOCAL_INFILE=1
-DWITH_READLINE=1
-DWITH_SSL=system
-DWITH_ZLIB=system
-DWITH_LIBWRAP=0
-DMYSQL_TCP_PORT=3306 
-DEXTRA_CHARSETS=all 
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci   
-DWITH_EXTRA_CHARSETS:STRING=all 
-DMYSQL_USER=mysql 
-DWITH_DEBUG=0
#make
#make install
#make clean
#chown -R mysql.mysql /usr/local/mysql
#chown -R mysql.mysql /data/mysqldata
#cd /usr/local/mysql/scripts
#mysql_install_db --datadir=/data/mysqldata --basedir=/usr/local/mysql --user=mysql
#cd ../support-files
#cp my-large.cnf /etc/rc.d/my.cnf    //这个配置文件只是为了应付初始化安装的,生产环境中肯定还是要其他配置的。。。。
#cp -p mysql.server /etc/rc.d/init.d/mysqld
#chown -R root.mysql /usr/local/mysql
#service mysqld start
#mysqladmin -u root passwod "lxm"   //设置MySQL root用户的密码
[root@test1 mysql]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.38-log Source distribution

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
由上面的信息可知,使用root用户输入密码后可以登录,表示mysql已经安装成功。。。。


2.MySQL安全初始化
 这里的MySQL安全初始化并不是讲什么大是大非,而是MySQL在安全完成后,某人有几个空密码的账户,需要随手将其关闭。。。
 默认情况下,除了安装时用mysqladmin设置的密码,其他所有的用户名都是空密码,统统干掉。。。。
[root@test1 mysql]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.38-log Source distribution

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use mysql;
Database changed
mysql> delete from user where Password = '';
Query OK, 5 rows affected (0.00 sec)

由上面的信息,可知已经干掉。。。。是不是感觉安全了一点点。。。。


注:这里要特别强调一下的是mysql的用户名到底指的是什么,在mysql中一个完整的用户是 'hostname'@'username'的组合,而不是单独分开的字段,那都不是mysql的用户名。。。。
 
三:PHP服务搭建
1.安装PHP
安装必须的软件包:
#yum -y install ncurses-devel  net-snmp-devel  bzip2 bzip2-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel freetype-devel libxml2 libxml2-devel libxslt libxslt-devel zlib zlib-devel expat expat-devel openssl openssl-devel gd php-gd libjpeg libjpeg-devel libtool libtool-ltdl libtool-ltdl-devel

安装libmcrypt和mhash  //这两个东西都是为php提供加密算法相关的库文件的
#cd /root/soft
#tar -zxvf libmcrypt-2.5.7.tar.gz
#cd libmcrypt-2.5.7
#mkdir /usr/local/libmcrypt
#./configure --prefix=/usr/local/libmcrypt
#make && make install
#make clean

#cd /root/soft
#tar -zxvf mhash-0.9.9.tar.gz
#cd mhash-0.9.9.9  // 这里注意下解压出来的文件名,其实上面的应该是0.9.9.9 我把它给改了。。
#mkdir /usr/local/mhash
#./configure --prefix=/usr/local/mhash
#make && make install
#make clean

安装php:
#cd /root/soft/
#tar -zxvf  php-5.5.16.tar.gz
#cd php-5.5.16
#mkdir /usr/local/php55
#CFLAGS="-m64 -O3" CXXFLAGS="-m64 -O3" ./configure --prefix=/usr/local/php55/  --with-apxs2=/usr/local/apache24/bin/apxs --with-libxml-dir=/usr/include/libxml2/ --with-config-file-path=/etc --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-gd --enable-gd-native-ttf --with-zlib --with-mcrypt=/usr/local/libmcrypt/ --with-mhash=/usr/local/mhash/ --with-pdo-mysql=mysqlnd  --enable-shmop --enable-soap --enable-sockets --enable-wddx --enable-zip --with-xmlrpc --enable-mbstring --with-zlib-dir=/usr/lib --with-bz2 --with-curl --enable-exif --enable-ftp --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib --with-freetype-dir=/usr/lib --with-pcre-dir --enable-bcmath --with-config-file-scan-dir=/etc/php.d/ --with-openssl
如果没有错误,将会显示下面的内容:
Generating files
configure: creating ./config.status
creating main/internal_functions.c
creating main/internal_functions_cli.c
+--------------------------------------------------------------------+
|                        *** WARNING ***                             |
|                                                                    |
| You have built PHP for Apache's current non-threaded MPM.          |
| If you change Apache to use a threaded MPM you must reconfigure    |
| PHP with --enable-maintainer-zts                                   |
+--------------------------------------------------------------------+
| License:                                                           |
| This software is subject to the PHP License, available in this     |
| distribution in the file LICENSE.  By continuing this installation |
| process, you are bound by the terms of this license agreement.     |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point.                            |
+--------------------------------------------------------------------+

Thank you for using PHP.

config.status: creating php5.spec
config.status: creating main/build-defs.h
config.status: creating scripts/phpize
config.status: creating scripts/man1/phpize.1
config.status: creating scripts/php-config
config.status: creating scripts/man1/php-config.1
config.status: creating sapi/cli/php.1
config.status: creating sapi/cgi/php-cgi.1
config.status: creating ext/phar/phar.1
config.status: creating ext/phar/phar.phar.1
config.status: creating main/php_config.h
config.status: executing default commands

注:这里似乎和nginx的有点不同啊,这里出了一个警告信息,意思是说你内建了php到apache非线程的工作模型当中,如果要支持apache的线程模型即需要使用--enable-maintainer-zts。这个跟apache的工作模型有关,apache有两种典型的模型prefork和worker模型,如果你要支持worker模型,请添加--enable-maintainer-zts选项。。。。有人会问 你为什么不一开始说明?无非是
要是使你加深印象,没经历过的你永远都记不住。。。。。

#make && make install
如果没有错误将显示下面的内容:
Installing shared extensions:     /usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/
Installing PHP CLI binary:        /usr/local/php55/bin/
Installing PHP CLI man page:      /usr/local/php55/php/man/man1/
Installing PHP FPM binary:        /usr/local/php55/sbin/
Installing PHP FPM config:        /usr/local/php55/etc/
Installing PHP FPM man page:      /usr/local/php55/php/man/man8/
Installing PHP FPM status page:      /usr/local/php55/php/fpm/
Installing PHP CGI binary:        /usr/local/php55/bin/
Installing PHP CGI man page:      /usr/local/php55/php/man/man1/
Installing build environment:     /usr/local/php55/lib/php/build/
Installing header files:          /usr/local/php55/include/php/
Installing helper programs:       /usr/local/php55/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/local/php55/php/man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /usr/local/php55/lib/php/
[PEAR] Archive_Tar    - installed: 1.3.12
[PEAR] Console_Getopt - installed: 1.3.1
[PEAR] Structures_Graph- installed: 1.0.4
[PEAR] XML_Util       - installed: 1.2.3
[PEAR] PEAR           - installed: 1.9.5
Wrote PEAR system config file at: /usr/local/php55/etc/pear.conf
You may want to add: /usr/local/php55/lib/php to your php.ini include_path
/root/soft/php-5.5.16/build/shtool install -c ext/phar/phar.phar /usr/local/php55/bin
ln -s -f /usr/local/php55/bin/phar.phar /usr/local/php55/bin/phar
Installing PDO headers:          /usr/local/php55/include/php/ext/pdo/
#make clean

#cp php.ini-production /etc/php.ini

注意:这里编译php直接整合到了apache中,而不是以单独的形式存在,因此使用了--with-apxs2选项,而没有使用--enable-fpm ,这两个选项是不能共存的。为什么整合进apache中,因为如
果要动静分离,完全可以是用nginx配置php,nginx的处理静态文件的性能要比apache优越的多的多。。。而LAMP是一个古典型的架构,稳定。。

#cd /usr/local/php55/bin
#./php -m | less  //查看php的模块,如果有抱不能加载的模块,请删除/etc/php.d/目录下的所有内容,至于为什么请看我的LNMP中的介绍....后期会在单独的php介绍中在挑出来。。。

 


2.PHP初始化工作
 对于PHP的初始化工作,一个典型的就是时区的设置,如果你不设置在某些页面访问时会在你的页面头部报一个大大的警告信息,你的日志中也会不停的提示这个警告信息,说你时区有问题
啊,要设置啊。。。
修改php.ini文件:
;date.timezone =
date.timezone = PRC

找到上面的指令选项,将时区设置为PRC 或者设置为你所在的标准时区,像中国大陆 就可以设置为Asia/Shanghai,但是这个跟系统的时区又有关系了,所以你在安装系统的时候,选择时区时就
需要选项Asia/Shanghai.关于时区的介绍,请看linux系统基础分析。。。。

3.扩展常见的PHP模块
 PHP有内建模块也有扩展模块,内建模块在编译的时候可以使用不同的选项来进行开启,将其编译进php中,而扩展模块也是动态加载。接下来聊几个常见的扩展模块,让你知道怎么样给php
添加模块.

 php源码中自带了很多模块的编译文件,如果编译完php后,发现有的没有编译进去,又需要使用,此时可以将其编译成动态模块,然后动态加载。。php源码所带的模块都在ext目录下,
例如我这里的都在/root/soft/php-5.5.16/ext目录下。
/root/soft/php-5.5.16/ext
[root@test1 ext]# ls
bcmath      dba                 fileinfo  iconv      mbstring  odbc       pdo_firebird  phar        shmop      sqlite3    tokenizer  zip
bz2         dom                 filter    imap       mcrypt    opcache    pdo_mysql     posix       simplexml  standard   wddx       zlib
calendar    enchant             ftp       interbase  mssql     openssl    pdo_oci       pspell      skeleton   sybase_ct  xml
com_dotnet  ereg                gd        intl       mysql     pcntl      pdo_odbc      readline    snmp       sysvmsg    xmlreader
ctype       exif                gettext   json       mysqli    pcre       pdo_pgsql     recode      soap       sysvsem    xmlrpc
curl        ext_skel            gmp       ldap       mysqlnd   pdo        pdo_sqlite    reflection  sockets    sysvshm    xmlwriter
date        ext_skel_win32.php  hash      libxml     oci8      pdo_dblib  pgsql         session     spl        tidy       xsl
[root@test1 ext]#

这里我不讲怎么动态的添加这些模块,因为方法跟我接下来要讲的添加扩展模块的方法是一样的。。。。

1)安装ImageMagick+imagick代替gd渲染图片
 imagick是一个PHP的扩展,用ImageMagick提供的API来进行图片的创建与修改,不过这些操作已经包装到扩展imagick中去了,最终调用的是ImageMagick提供的API
 ImageMagick是一套软件系列,主要用于图片的创建、编辑以及转换等,详细的解释见ImageMagick的官方网站
http://www.p_w_picpathmagick.org/,ImageMagick比GD的性能要高很多,
如果是在处 理大量的图片时更加能体现ImageMagick的性能。

由于安装imagick扩展时需要依赖ImageMagick的函数库,因此必须要先安装ImageMagick

安装ImageMagick
#cd /root/soft
#tar -jxvf ImageMagick-6.8.0-4.tar.bz2
#cd ImageMagick-6.8.0-4
#mkdir /usr/local/p_w_picpathmagick
#chmod -R 775 p_w_picpathmagick
#./configure --prefix=/usr/local/p_w_picpathmagick
configure完成后会出现下面的信息:
                  Option                        Value
-------------------------------------------------------------------------------
Shared libraries  --enable-shared=yes  yes
Static libraries  --enable-static=yes  yes
Module support    --with-modules=no  no
GNU ld            --with-gnu-ld=yes  yes
Quantum depth     --with-quantum-depth=16 16
High Dynamic Range Imagery
                  --enable-hdri=no  no

Delegate Configuration:
BZLIB             --with-bzlib=yes  yes
Autotrace         --with-autotrace=no  no
Dejavu fonts      --with-dejavu-font-dir=default none
DJVU              --with-djvu=yes  no
DPS               --with-dps=yes  no
FFTW              --with-fftw=yes  no
FlashPIX          --with-fpx=yes  no
FontConfig        --with-fontconfig=yes  no
FreeType          --with-freetype=yes  yes
GhostPCL          None    pcl6 (unknown)
GhostXPS          None    gxps (unknown)
Ghostscript       None    gs (unknown)
Ghostscript fonts --with-gs-font-dir=default none
Ghostscript lib   --with-gslib=no  no
Graphviz          --with-gvc=no  
JBIG              --with-jbig=yes  no
JPEG v1           --with-jpeg=yes  yes
JPEG-2000         --with-jp2=yes  no
LCMS v1           --with-lcms=yes  no
LCMS v2           --with-lcms2=yes  no
LQR               --with-lqr=yes  no
LTDL              --with-ltdl=yes  no
LZMA              --with-lzma=yes  no
Magick++          --with-magick-plus-plus=yes yes
OpenEXR           --with-openexr=yes  no
PERL              --with-perl=no  no
PANGO             --with-pango=yes  no
PNG               --with-png=yes  yes
RSVG              --with-rsvg=no  no
TIFF              --with-tiff=yes  no
WEBP              --with-webp=yes  no
Windows fonts     --with-windows-font-dir= none
WMF               --with-wmf=no   no
X11               --with-x=   no
XML               --with-xml=yes  yes
ZLIB              --with-zlib=yes  yes
从上面的信息可以看到支持那些格式的文件和图片,如果没有你需要的请自行安装。。。。

#make && make install
#make clean


安装imagick
#cd /root/soft
#tar -zxvf imagick-3.1.2.tgz
#cd imagick-3.1.2
#/usr/local/php/bin/phpize
#./configure --with-php-config=/usr/local/php55/bin/php-config --with-imagick=/usr/local/p_w_picpathmagick
#make
#make install
执行make install后,会将p_w_picpathmagick的动态库和相关的头文件安装到php下对应的目录中:
Installing shared extensions:     /usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/
Installing header files:          /usr/local/php55/include/php/
#make clean
[root@test1 imagick-3.1.2]# cd /usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/
[root@test1 no-debug-non-zts-20121212]# ls
imagick.so  opcache.so
[root@test1 no-debug-non-zts-20121212]#
由上面的信息,可知确实将模块安装到了该路径下。


整合imagick到php中
创建/etc/php.d/imagick.ini文件,内容如下:
[root@test1 no-debug-non-zts-20121212]# cat /etc/php.d/imagick.ini
extension=/usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/imagick.so   //指定动态模块的路径
[root@test1 no-debug-non-zts-20121212]#

检测模块是否成功加载:
[root@test1 no-debug-non-zts-20121212]# cd /usr/local/php55/bin/
[root@test1 bin]# ./php -m | grep imagick
imagick
[root@test1 bin]#
由上面的测试可知,已经成功加载。。。。

到此,一个完整的添加php模块的过程就结束了。。。所有的php动态模块的添加都是这个步骤。。。

2)整合Zend Opcache
 从php5.5之后,zend optimizer+的功能已经集成到php的内核里面了,不在需要重新编译安装模块,而在早起的php版本中,都还需要安装zendopcache之类的东东。。现在已经不需要的。。
[root@test1 php55]# cd /usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/
[root@test1 no-debug-non-zts-20121212]# ls
imagick.so  opcache.so
[root@test1 no-debug-non-zts-20121212]#
由上面的信息可知opcache已经被集成了,php安装好之后就已经安装了,但是默认并没有加载,请看:
[root@test1 bin]# /usr/local/php55/bin/php -m | grep -i Zend
[Zend Modules]
[root@test1 bin]#
查看zend模块,没有任何的信息。。。。

加载并配置opcache:
#vim /etc/php.d/opcache.ini //内容如下
[opcache]
zend_extension ="/usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/opcache.so"
opcache.memory_consumption=128
opcache.optimization_level=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4096
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable=1
opcache.enable_cli=1 
 
检查:
[root@test1 bin]# /usr/local/php55/bin/php -m | grep -i Zend
Zend OPcache
[Zend Modules]
Zend OPcache
[root@test1 bin]#
[root@test1 bin]# /usr/local/php55/bin/php -v
PHP 5.5.16 (cli) (built: Aug 28 2014 16:49:16)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
[root@test1 bin]#
由上面的信息,可以看出zend opcache已经生效了。。

说明:
 在php5.5的版本中,zend engine已经被集成到php中,安装完php之后你可以使用php -v来查看,或者使用php.info的测试页来查看,而早期的版本,你还需要单独安装zend engine。
 zend engine 是用来优化php代码的执行,将php的代码先分析编译转换成二进制的opcode代码,然后zend直接去执行opcode,大大提高了执行的速度。。
 

3)Xcache
 Xcache的功能是用来缓存opcode,加速PHP的执行速度,可以简单的说为是PHP的加速器。。。。
php5.4以上的版本必须使用XCache2.0以上才能支持
安装:
#tar -jxvf xcache-3.1.0.tar.gz
#cd  xcache-3.1.0.tar.gz
#/usr/local/php55/bin/phpize   
#./configure --enable-xcache --with-php-config=/usr/local/php55/bin/php-config
#make && make install
Installing shared extensions:     /usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/
#make clean

注意:在安装xcache的时候,一定要注意版本的问题,php的版本越高,需要的xcache的版本就要高,否则会出现zend 不支持的错误,例如:make: *** [processor.out.c] Error 1

整合xcache到php;
[root@test1 xcache-3.1.0]# ls
acinclude.m4    config.log     gen_structinfo.awk  Makefile            mod_coverager     run-tests.php     xcache.ini
aclocal.m4      config.m4      htdocs              Makefile.frag       mod_decoder       run-xcachetest    xcache.la
AUTHORS         config.nice    include             Makefile.frag.deps  mod_disassembler  structinfo.m4     xcache.lo
autom4te.cache  config.status  includes.c          Makefile.fragments  mod_encoder       tests             xcache-test.ini
bin             config.sub     includes.i          Makefile.global     mod_optimizer     THANKS            xcache-zh-gb2312.ini
build           configure      INSTALL             Makefile.objects    modules           util              xc_processor.c.h
ChangeLog       configure.in   install-sh          missing             NEWS              xcache            xc_processor.h
config.guess    config.w32     lib                 mkinstalldirs       processor         xcache.c
config.h        COPYING        libtool             mod_assembler       processor.out.c   xcache_globals.h
config.h.in     devel          ltmain.sh           mod_cacher          README            xcache.h
[root@test1 xcache-3.1.0]# cp xcache.ini /etc/php.d/
[root@test1 xcache-3.1.0]# vim /etc/php.d/xcache.ini
将:
extension = xcache.so
修改为:
extension = /usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/xcache.so
[root@test1 xcache-3.1.0]# /usr/local/php55/bin/php -m | grep -i -A6 "Zend"
Zend OPcache
zip
zlib

[Zend Modules]
XCache
XCache Cacher
Zend OPcache

[root@test1 xcache-3.1.0]# /usr/local/php55/bin/php -v
PHP 5.5.16 (cli) (built: Aug 28 2014 16:49:16)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with XCache v3.1.0, Copyright (c) 2005-2013, by mOo
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
    with XCache Cacher v3.1.0, Copyright (c) 2005-2013, by mOo
[root@test1 xcache-3.1.0]#

由上面的信息可知xcache整合成功。。。。。


到此,基本上php常见的几个扩展模块,都已经做了整合。。。。。

 

四:LAMP平台整合  
1.httpd整合php
 httpd整合php的方法有三种:
1)常见方法一
#vim /usr/local/apache24/conf/httpd.conf

加载php5模块:


wKiom1P_-MjSi-RXAABW_nJNN4U769.jpg

找到AddType选项的位置,增加两行内容:
wKioL1P_-d_QM0mhAAHCpQkGF1M423.jpg

找到DirectoryIndex,添加php文件的索引文件:
wKiom1P_-MiwpYyrAAB1x2wbeZM313.jpg

 

 

2)常见方法二
#vim /usr/local/apache24/conf/httpd.conf
加载php5模块:
wKiom1P_-MjSi-RXAABW_nJNN4U769.jpg

添加php5 AddHandler:

wKioL1P_-eDBxdUhAABtDVoFdKM179.jpg

 

找到DirectoryIndex,添加php文件的索引文件:
wKiom1P_-MiwpYyrAAB1x2wbeZM313.jpg

 

3)fastcgi的方式,但是由于该文档中编译安装时使用的是--with-apxs2而不是--enable-fpm,所以无法测试该方法。其次,如果php使用fastcgi的方式来管理,建议和nginx联合使用。。


选择上面的任意一种方式整合httpd和php,然后在/usr/local/apache24/htdocs目录中创建一个index.php的测试页,重启httpd服务,访问测试页,如果能看到测试页,则整合成功,否则看日志排错。
index.php测试页内容:
<?php
phpinfo();
?>

注意:这个测试页一定要记住啊。。。。

此外,介绍一个指定php.ini文件的知识点:PHPIniDir  在配置文件中使用该选项可以指定php.ini文件在任何的位置。。
example:
PHPIniDir "/usr/local/apache24/conf/php.ini"

 

2.php整合MySQL测试
 关于php整合mysql的测试,在LNMP架构中已经有所介绍,这里不在细说,直接上测试代码:
#vim /usr/local/apache24/htdocs/index.php
修改内容如下:
<?php
$links=mysql_connect('localhost','root','lxm');
if ($links)
    echo "yes";
else
    echo "no";
?>

#vim /etc/php.ini
mysql.default_socket = /tmp/mysqld.sock    

注:修改mysql的socket位置是因为编译时使用了mysqlnd,查找时默认查找的是/var/lib/mysql/mysqld.sock。所以必须修改,否则会报mysql_connect函数找不到。。

#/usr/local/apache24/bin/apachectl -k restart

测试;
[root@test1 bin]# links --dump
http://10.0.10.11/index.php
   yes
[root@test1 bin]#

可见测试成功,,到此一个完整的LAMP平台就基本搭建完成了。。。。


附:
 源码编译的httpd默认没有LSB格式的启动脚步,如果需要到网上down一个,或者使用rpm包提供的httpd启动脚步,修改一下。此外有需要软件包的,可以跟我要。。。。。

到此,LAMP平台架构就聊到这里,更多技术请看下回分解。。。。。
  
 笨蛋的技术------不怕你不会!!!!