一、何为LAMP

    Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。随着开源潮流的蓬勃发展,开放源代码的LAMP已经与J2EE.Net商业软件形成三足鼎立之势,并且该软件开发的项目在软件方面的投资成本较低,因此受到整个IT界的关注。从网站的流量上来说,70%以上的访问流量是LAMP来提供的,LAMP是最强大的网站解决方案


二、软件组合

    Linux

        Linux 是免费开源软件,这意味着源代码可用的操作系统。

    Apache

        Apache 是使用中最受欢迎的一个开放源码的WEB服务器软件。

    MySQL

        MySQL 是多线程、多用户的SQL数据库管理系统。

        MySQL 已由Oracle公司自 2010 年 1 月 27 日通过SUN购买。SUN 最初于 2008 年 2 月 26 日收购 MySQL。

    MariaDB

        MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发。MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。由于不满MySQL被Oracle收购后的日渐封闭与缓慢的更新,众多Linux发行版逐渐抛弃了这个人气开源数据库,而转向了MariaDB。其中Centos 7默认已经采用MariaDB。互联网中维基百科,互联网巨头谷歌纷纷放弃MySQL转向MariaDB。

    PHP

        PHP 是一种编程语言最初设计生产动态网站。PHP 是主要用于服务器端的应用程序软件。


三、编译安装Apache

[root@localhost ~]# yum groupinstall -y "Development Tools" "Server Platform Development"
#通过“包组”提供开发工具(make, gcc等)及开发环境(开发库,头文件,标准库等)

    由于httpd-2.4需要依赖于apr-1.4和apr-util-1.4以上的版本,所以我们先编译安装此两个源码。apr全称apache portable runtime(Apache可移植运行库)。主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。

[root@localhost ~]# tar xf apr-1.5.2.tar.bz2 
[root@localhost ~]# cd apr-1.5.2
[root@localhost apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@localhost apr-1.5.2]# make -j 4 && make install

    apr-1.5.2下载地址:http://mirrors.aliyun.com/apache/apr/apr-1.5.2.tar.bz2


[root@localhost ~]# tar xf apr-util-1.5.4.tar.bz2
[root@localhost ~]# cd apr-util-1.5.4
[root@localhost apr-util]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@localhost apr-util]# make -j 4 && make install

    apr-util-1.5.4下载地址:http://mirrors.aliyun.com/apache/apr/apr-util-1.5.4.tar.bz2


    由于httpd-2.4.16编译过程依赖于pcre-devel软件包,需要事先安装。此软件包系统光盘自带,因此,可以直接挂载光盘使用yum安装。

[root@localhost ~]# yum install -y pcre-devel
[root@localhost ~]# tar xf httpd-2.4.16.tar.bz2
[root@localhost ~]# cd httpd-2.4.16
[root@localhost httpd-2.4.16]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 
--enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/
local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all 
--with-mpm=event
#--prefix:安装目录,--sysconfdir:配置文件目录,--enable-so:支持模块化机制,--enable-ssl:启动ssl
#--enable-cgi:启动cgi,--enable-rewrite:支持url重新,--with-zlib:支持传送压缩,--with-pcre:支持正则表达式
#--with-apr:指明apr安装路径,--with-apr-util:指明apr-util安装路径,--enable-modules:指明启用的模块
#--enable-mpms-shared:把所有支持的MPM都编译进来,--with-mpm:默认使用的MPM
[root@localhost httpd-2.4.16]# make -j 4 && make install

    httpd-2.4.16下载地址:http://mirrors.aliyun.com/apache/httpd/httpd-2.4.16.tar.bz2


    为了后期管理方便,我们这里为编译安装的httpd-2.4提供一个管理脚本,可以复制通过yum源安装的httpd-2.2的配置文件进行修改。

[root@localhost ~]# cd /etc/rc.d/init.d/
[root@localhost init.d]# cp httpd httpd24
[root@localhost init.d]# vim httpd24
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
pidfile=${PIDFILE-/var/run/httpd/httpdi24.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
[root@localhost init.d]# chkconfig --add httpd24
#把httpd2.4设置为系统服务
[root@localhost init.d]# vim /etc/profile.d/httpd24.sh
export PATH=/usr/local/apache/bin:$PATH
[root@localhost init.d]# . /etc/profile.d/httpd24.sh 
#把刚编译好的httpd2.4的脚本运行命令添加到环境变量中
[root@localhost init.d]# httpd -t
Syntax OK
[root@localhost init.d]# /etc/init.d/httpd24 start
Starting httpd:                                            [  OK  ]
[root@localhost init.d]# ss -anl
State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port    
LISTEN     0      128                      :::80                      :::* 
#查看80端口已经处于监听状态


四、编译安装Mariadb

[root@wlw ~]# mkdir -pv /mariadb/data
[root@wlw ~]# chown -R mysql:mysql /mariadb/data/
#创建mariadb存放数据的位置
[root@wlw /]# groupadd -r mysql
[root@wlw /]# useradd -g mysql -r -s /sbin/nologin -M -d /mariadb/data mysql
#为mariadb新建用户以安全方式运行进程
[root@wlw ~]# tar xf mariadb-5.5.42.tar.gz -C /usr/local/
root@wlw ~]# cd /usr/local/
[root@wlw local]# ln -sv mariadb-5.5.42 mysql
`mysql' -> `mariadb-5.5.42'
[root@wlw local]# cd mysql/
[root@wlw mysql]# chown -R root:mysql ./*
[root@wlw mysql]# scripts/mysql_install_db --user=mysql --datadir=/mariadb/data
#--user:运行mariadb的用户名,--datadir:制定数据存放位置,由于数据库数据较大,一般单独分区存放(LVM)
[root@wlw mysql]# mkdir /etc/mysql
[root@wlw mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf
#为mariadb提供主配置文件,存放在/etc/mysql中
[root@wlw mysql]# vim /etc/mysql/my.cnf
thread_concurrency = 2
datadir = /mariadb/data
#thread_concurrency:的值建议为你的CPU个数乘以2,datadir:数据库存放位置

    Mariadb下载地址:http://archive.mariadb.org//mariadb-5.5.43/bintar-linux-x86_64/mariadb-5.5.43-linux-x86_64.tar.gz


    为了后期管理方便,我们这里同样为mariadb提供服务脚本,这里mariadb中已经为我们提供好了,存放在 support-files/mysql.server 中

[root@wlw mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@wlw mysql]# chkconfig --add mysqld
[root@wlw mysql]# /etc/init.d/mysqld start
Starting MySQL..                                           [确定]
[root@wlw mysql]# ss -tnl
LISTEN     0      50                        *:3306                     *:*
[root@wlw mysql]# ./bin/mysql_secure_installation
#按照配置完成后建议对mariadb进行安全初始化,为root提供密码和删除匿名用户,使用mariadb默认提供的脚本

    

    为了使mariadb的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤

[root@wlw mysql]# vim /etc/man.config 
MANPATH /usr/local/mysql/man
#输出mysql的man手册至man命令的查找路径
[root@wlw mysql]# ln -sv /usr/local/mysql/include  /usr/include/mysql
#输出mysql的头文件至系统头文件路径/usr/include
[root@wlw mysql]# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
#输出mysql的库文件给系统库查找路径
[root@wlw mysql]# ldconfig
#让系统重新载入系统库
[root@localhost init.d]# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
[root@localhost init.d]# . /etc/profile.d/mysql.sh 
#把刚编译好的mysql的脚本运行命令添加到环境变量中


五、编译安装PHP

[root@wlw ~]# yum -y groupinstall "Desktop Platform Development" 
[root@wlw ~]# yum -y install bzip2-devel libmcrypt-devel libxml2-devel
#解决php编译依赖关系,bzip2-devel在光盘中有提供,libmcrypt-devel在epel源中
[root@wlw ~]# tar xf php-5.4.40.tar.bz2 
[root@wlw ~]# cd php-5.4.40
[root@wlw php-5.4.40]# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-
openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir 
--with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml  --enable-sockets 
--with-apxs2=/usr/local/apache/bin/apxs --with-mcrypt  --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2  --enable-maintainer-zts
#--prefix:默认安装路径,--with-mysql:指定mysql安装路径,--with-openssl:支持openssl,--with-mysqli:指定mysqli安装目录
#--enable-mbstring:开启多字节字符串的支持,支持中文必须开启,--with-zlib:支持压缩库,--enable-xml:支持处理xml文档
#--with-apxs2:把php编译成apache的模块,--with-mcrypt:开启加解密,--enable-maintainer-zts:这里为了支持apache的worker或event这两个MPM,编译成zts模块
[root@wlw php-5.4.40]# make -j 4 && make install
[root@wlw php-5.4.40]# cp php.ini-production /etc/php.ini
#为php提供配置文件
[root@wulewei ~]# vim /etc/httpd24/httpd.conf
LoadModule php5_module        modules/libphp5.so
#编译php过程中自动添加的php模块(支持zts功能)
AddType application/x-httpd-php  .php
AddType application/x-httpd-php-source  .phps
#让.php结尾的文件都识别为application/x-httpd-php-source的MINE类型,这种类型需要调用php模块处理
DirectoryIndex  index.php  index.html
#添加index.php到首页次序中
[root@wulewei ~]# /etc/init.d/httpd24 reload
#修改完配置文件后让httpd重读配置文件,让配置生效
[root@wulewei ~]# vim /usr/local/apache/htdocs/index.php
 <?php
      $link = mysql_connect('127.0.0.1','root','wlwsldya');
      if ($link)
        echo "<p align='center'>Success...</p>";
      else
        echo "Failure...";

      mysql_close();
      phpinfo();
?>

wKiom1YGGHnz8_fGAAOBFYwHMOY980.jpg

    可以看到LAMP已经整合完毕,httpd已经可以运行php。


、编译安装xcache,为php加速

    XCache:快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。

    PHP的Opcode:Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行PHP脚本代码一般会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend):

四个步骤为:扫描-->分析-->编译-->执行

1、Scanning(Lexing) —— 将PHP代码转换为语言片段(Tokens)

2、Parsing —— 将Tokens转换成简单而有意义的表达式

3、Compilation —— 将表达式编译成Opocdes

4、Execution —— 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能

    php的加速器

        基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。由此也可以看出,这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的。一般能块三倍左右!

[root@wlw ~]# tar xf xcache-3.2.0.tar.bz2
[root@wlw ~]# cd xcache-3.2.0
[root@wlw xcache-3.2.0]# /usr/local/php/bin/phpize 
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525
#读取当前配置生成configure文件
[root@wlw xcache-3.2.0]# ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
#--with-php-config:编译成php的扩展
[root@wlw xcache-3.2.0]# make && make install
Installing shared extensions:  /usr/local/php/lib/php/extensions/no-debug-zts-20100525/
#编译安装完成后会显示模块的安装路径

    整合php和xcache

[root@wlw xcache-3.2.0]# mkdir /etc/php.d
[root@wlw xcache-3.2.0]# cp xcache.ini /etc/php.d
#将xcache提供的样例配置导入php.d目录中让其配置文件生效
[root@wlw xcache-3.2.0]# cd /etc/php.d
[root@wlw php.d]# vim xcache.ini 
extension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xcache.so

    测试支持xcache的php的加速效果,这里使用ab命令来简单测试,这里直接给出测试结果

[root@wlw ~]# ab -c 100 -n 1000 http://192.168.0.101/index.php
-n: 总的请求数,-c:模拟的并发数,-k: 以持久连接模式测试

使用xcache加速前:

Requests per second:    36.38 [#/sec] (mean)(每秒的事务数,即每秒请求的资源)

Time per request:       274.871 [ms] (mean)

Time per request:       27.487 [ms] (mean, across all concurrent requests)


使用xcache加速后:

Requests per second:    144.23 [#/sec] (mean)

Time per request:       69.332 [ms] (mean)

Time per request:       6.933 [ms] (mean, across all concurrent requests)

从这里可以看到xcache对php程序的加速效果。这里效果比较好,一般来说效果为3倍左右

    

七、编译安装PHP,以fastcgi(fpm)作为php独立运行服务

    fastcgi是一个协议,php-fpm实现了这个协议。

    一般情况下,FastCGI的整个工作流程是这样的:    

        1、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)

        2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待WebServer的连接。

        3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。 Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

        4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。在CGI模式中,php-cgi在此便退出了。

[root@wlw ~]# rm -rf php-5.4.40
#这里我之前已模块化编译安装过一次php,所以这里有一次删除操作,如果是第一次编译忽略此删除操作
[root@wlw ~]# tar xf php-5.4.40.tar.bz2 
[root@wlw php-5.4.40]# ./configure --prefix=/usr/local/phpfpm --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml  --enable-sockets --enable-fpm --with-mcrypt  --with-config-file-path=/etc/phpfpm --with-config-file-scan-dir=/etc/phpfpm.d --with-bz2
#--enable-fpm:开启fpm模式

    生产fpm配置文件及其相关配置

[root@wlw php-5.4.40]# mkdir -pv /etc/phpfpm{,.d}
[root@wlw php-5.4.40]# cp php.ini-production /etc/phpfpm/php.ini
#为php提供配置文件
[root@wlw php-5.4.40]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@wlw php-5.4.40]# chmod +x /etc/init.d/php-fpm 
[root@wlw php-5.4.40]# chkconfig --add php-fpm
#为php-fpm提供SysV init脚本,并将其添加至服务列表
[root@wlw httpd-2.4.16]# cd /usr/local/phpfpm/etc/
[root@wlw etc]# mv php-fpm.conf.default php-fpm.conf
#为php-fpm提供配置文件
[root@wlw ~]# vim /usr/local/php5/etc/php-fpm.conf
listen = 0.0.0.0:9000
#PHP-FPM监听的套接字
pid = /usr/local/phpfpm/var/run/php-fpm.pid 
#启用pid文件
pm.max_children = 50
#最大并发进程数
pm.start_servers = 5
#服务启动开启的进程数
pm.min_spare_servers = 2
#最少空闲进程数
pm.max_spare_servers = 8
#最大空闲进程数
[root@wlw ~]# /etc/init.d/php-fpm start
Starting php-fpm  done
[root@wlw ~]# ss -tnl
LISTEN     0      128                       *:9000                     *:*
#端口已经成功监听
[root@wlw ~]# ps aux | grep php-fpm
root      8201  0.0  0.5 252760  4096 ?        Ss   12:43   0:00 php-fpm: master process (/usr/local/phpfpm/etc/php-fpm.conf)                                                                       
nobody    8202  0.0  0.4 252760  3632 ?        S    12:43   0:00 php-fpm: pool www                                                                                                                     
nobody    8203  0.0  0.4 252760  3632 ?        S    12:43   0:00 php-fpm: pool www                                                                                                                     
nobody    8204  0.0  0.4 252760  3636 ?        S    12:43   0:00 php-fpm: pool www                                                                                                                     
nobody    8205  0.0  0.4 252760  3636 ?        S    12:43   0:00 php-fpm: pool www                                                                                                                     
nobody    8206  0.0  0.4 252760  3636 ?        S    12:43   0:00 php-fpm: pool www   
#可以看到开启服务后启动了5个空闲子进程,与配置文件中指定的一致

    让httpd加载和启用php-fpm

[root@wlw ~]# vim /etc/httpd24/httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#在Apache httpd 2.4以后已经专门有一个模块针对FastCGI的实现,此模块为mod_proxy_fcgi.so,它其实是作为mod_proxy.so模块的扩充,因此,这两个模块都要加载
AddType application/x-httpd-php  .php
AddType application/x-httpd-php-source  .phps
DirectoryIndex  index.php  index.html

    在对应的虚拟主机中添加

ProxyRequests Off
#以反向代理方式
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/PATH/TO/DOCUMENT_ROOT/$1
#正则匹配,所有以.php结尾的url请求,都基于fcgi协议转交给ip:9000端口+网页文件的存放位置,$1为正则的后向引用

wKiom1YGJiuyzWhcAAPjFUp05bg565.jpg

从phpinfo函数中已经可以看到Server API:FPM/FastCGI。代表已经使用php-fpm运行!


    注意:Apache httpd 2.4以前的版本中,要么把PHP作为Apache的模块运行,要么添加一个第三方模块支持PHP-FPM实现。