LAMP原理架构解析


目录:

1.LAMP架构解析

2.LAMP中PHP 种工作模式

 2.1 PHP模块化工作模式

 2.2 PHP模块化+XCache工作模式

 2.3 PHP的FPM工作模式

3.PHP工作模式及编译

 3.1 PHP工作模式介绍

 3.1 PHP的模块编译

 3.2 PHP的FPM编译


一、LAMP架构解析

   现如今打开浏览器,搜索LAMP关键词,出现大量的关于LAMP的介绍,包括LAMP的一键脚本、LAMP的yum安装、LAMP的编译安装,但是对于一个非开发或非专业人员有可能根据网络参考资源实现LAMP的搭建并成功运行各种服务,也有部分人员完全照搬某些博客知识进行搭建,最后以失败告终,因此抱怨互联网资源不够成熟,其实根本原因并非如此,主要原因如下:

  • 初学者对LAMP架构原理不熟悉

  • 初学者实验时所用系统和软件版本和某些博客资源并不相同

因此导致大量初学者以失败告终,其实只有了解并掌握LAMP的工作原理才能轻松的搭建成功,其次参数的配置都是次要因素,因为互联网上拥有大量的参考资料供查询,下面将逐一介绍

   L:很显然L代表Linux系统,但此L需注意系统的版本号,如Centos6.9或Centos7.3;

   A:表示apache,在传统行业中,多数采用Apache服务器,因此也很有必要了解学习Apache;

   M:表示数据库,多数采用mysql或mariadb,作为专业的数据库工程师需经多年的历练;

   P:表示PHP、python、perl等等编程语言。

   在这里注意讲解Linux+apache+mariadb+PHP组合的架构,架构图如下:

wKiom1nkByKQ1lIpAAHbqtbmux8712.jpg

图1-1 LAMP架构图

    根据图1-1中访问数据流可知,处理一次动态页面请求,服务器主要经历:Apache处理请求——通过CGI接口访问PHP的的应用程序——PHP应用程序调用PHP解释器执行PHP代码——PHP程序访问调用数据库——最后给客户做反馈。故在LAMP的环境机构中,apache、mariadb和php的主要功能分别如下。

    apache主要实现如下功能:

    第一:处理http的请求、构建响应报文等自身服务;

    第二:配置让Apache支持PHP程序的响应(通过PHP模块或FPM);

    第三:配置Apache具体处理php程序的方法,如通过反向代理将php程序交给fcgi处理。

    mariadb主要实现如下功能:

    第一:提供PHP程序对数据的存储;

    第二:提供PHP程序对数据的读取(通常情况下从性能的角度考虑,尽量实现数据库的读写分离)。

    php主要实现如下功能:

    第一:提供apache的访问接口,即CGI或Fast CGI(FPM);

    第二:提供PHP程序的解释器;

    第三:提供mairadb数据库的连接函数的基本环境。

    由此可知,要实现LAMP在配置每一个服务时,安装功能需求进行配置,即可实现LAMP的架构,当然apache、mariadb和php服务都可配置为独立服务,安装在不同电脑之上。

二.LAMP中PHP 种工作模式

    通过LAMP架构及功能介绍可知,PHP在的作用是承上启下,在搭建LAMP的环境时,仅需深刻理解PHP并会成功编译PHP的不同运行模式即可实现不同基于LAMP的应用服务成功搭建。

 2.1 PHP模块化工作模式

    PHP模块化工作方式,可以理解为将PHP封装为HTTPD中的一个函数,既然是HTTPD的一个函数,则PHP必须封装HTTPD中,因此PHP必须与HTTPD配置在同一台服务器中,而且不会作物独立的程序或进程运行,工作架构图如下:

wKiom1nkBsKQgT4fAAKxHXLMA_U550.jpg

图2-1 PHP模块化架构图

    由上图可知在安装PHP的rpm包后,生成httpd的模块目录下生成libphp5.so的模块,因此httpd在启动时可以自动加载此模块,从而提供CGI接口和PHP解释的功能,在安装php-mysql后,可以看出生成3中连接数据库的方法,但是通常采用mysql.ini和mysqli-ini的方法连接数据库,具体连接语法如下:

    数据库连接mysql.ini函数及测试脚本如下表:

$conn = mysql_connect('H-host','DBuser','DBpass'); #通常用在centos6

if ($conn)

     echo "DB connetct normal!";

else

     echo "DB connect Failure!";

mysql_close();

    数据库连接mysqli.ini函数及测试脚本如下:

$mysqli=new  mysqli("localhost","root","centos"); #通常兼容性较好可以在centos6

if(mysqli_connect_errno()){                         或centos7中;

     echo "数据库连接失败!";

     $mysqli=null;

     exit;

}

echo "数据库连接正常!";

$mysqli->close();

因此只需深刻理解PHP的三大功能,即可理解LAMP的工作原理及过程。上图实验环境为Centos6.9

 2.1 PHP模块化+XCache工作模式

    PHP模块化工作方式虽能正常运行,但是从性能角度考虑,PHP官方早前研究出内存间的缓存功能,将访问页面或请求资源多的页面在内存中做一份缓存,确保无需每次通过内存调动磁盘资源进行计算,另外XCache工作原理仅仅是在PHP模块化工作的模式基础之上安装了一个缓存功能的包,架构类似PHP模块化工作结构,具体如下所示:

wKiom1nkEXzA4oI6AALDE7duIUA832.jpg

图2-2 PHP+XCache架构图

    由上图可知,XCache功能仅需安装一个包即可实现缓存,经过实测在1颗CPU和1G内存的虚拟机主机上搭建wordpress博客,通过yum安装相关LAMP环境包,具体就不再此介绍,可参考架构图进行搭建或通过网络资源进行查看。

    在无XCache环境情况利用ab命令进行性能测试如下:

[ root@centos6 ~ ]#ab -c 10 -n 100 http://172.18.27.13/blog/

Total transferred:       928200 bytes

HTML transferred:        906100 bytes

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

Time per request:        604.766 [ms] (mean)

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

       在有XCache环境情况利用ab命令进行性能测试如下:

[ root@centos6 ~ ]#ab -c 10 -n 100 http://172.18.27.13/blog/

Total transferred:       928200 bytes

HTML transferred:        906100 bytes

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

Time per request:        244.307 [ms] (mean)

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

    通过性能测试发现在有XCache缓存的情况性,基本上能扩展到1.5倍左右,因此XCache是相当提升LAMP性能的功能模块,建议大家多多使用此功能模块。

    注意:在centos6.9中默认通过rpm 安装的lamp中,无法支持httpd的work.c模式。

    原因:在安装PHP的包时,只安装/usr/lib64/httpd/modules/libphp5.so模块,而

    在/etc/httpd/conf.d/php.conf中,此模块仅支持perfork.模式。

 2.3 PHP的FPM工作模式

    在大型集群环境中,通过模块化管理从性能的角度比较不如独立的进程进行处理效率高,因此一旦访问量较大时,建议PHP的CGI接口和PHP解释器独立运行,独立作为一个单独的进程进行处理动态程序,若作为独立处理动态程序时,根据PHP的三大功能(提供CGI接口、PHP解释器和连接DB的基本环境)进行协调配置承上启下的功能配置,具体结构如下图:

wKiom1nkHn3wPZxbAAK5M6MgQEk293.jpg

图2-3 PHP+FPM架构图

    由上图可知当编译PHP的FPM后,PHP作为独立的经常运行,此时根据PHP的三大功能,第一要素:配置httpd,让httpd支持处理PHP程序并知道处理PHP请求时,交由谁来处理,建议在/etc/httpd/conf.d/目录下新建文件,配置支持处理PHP请求,第二要素:提供CGI接口和PHP解释器,此步是由编译时开启此功能,第三要素:配置支持数据库连接,此步也是有编译时开启此功能,因此总结PHP在独立运行的配置方法为:编译初期开启PHP的CGI接口、PHP的解释功能和数据库连接功能模块,在编译完成之后再次调整HTTPD和PHP的连接发放,具体可参考如下配置(在conf.d目录下新建配置文件):

LoadModule proxy_module modules/mod_proxy.so                 #确保开启
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so       #确保开启

addtype application/x-httpd-php .php     

addtype application/x-httpd-php-source .php

DirectoryIndex   index.php

ProxyRequests  off

ProxyPassMatch ^/(.*\.php)$   fcgi://127.0.0.1:9000/var/www/html/$1 #PHP在本机

ProxyPassMatch ^/(.*\.php)$   fcgi://192.168.1.1:9000/var/www/html/$1 #PHP在其他主机

   通过PHP编译独立运行时,通过LAMP实现wordpress服务为示范,配置注意事项如下:

  (1)真正的程序是位置为:fcgi://127.0.0.1:9000/var/www/html/$1如果程序所处位置为:/var/www/html/blog/(php程序)则用户必须输入URL=http://172.18.27.14/blog/因为按照匹配模式(blog/.*.php)----提交给----fcgi://127.0.0.1:9000/var/www/html/blog/.*.php处理,刚好和提供动态资源php和静态资源图片的PHP资源位置相同,正常对外提供服务。

  (2)错误设置提醒,ProxyPassMatch ^/(.*\.php)$  fcgi://127.0.0.1:9000/var/www/html/blog/$1用户输入URL=http://172.18.27.14按照匹配模式:(.*.php)动态资源跳转至/var/www/html/blog/*取请求资源,而非php的请求在172.18.27.14的/var/www/html/目录中,然而WordPress在根目录下并无资源,因此会出现只解析出动态资源而无静态资源

  (3)总上所述配置此时,参考点在于想让用户输入什么链接时,则在服务器端设置什么样的目录,同时如下示范配置是通用配置,可以放在任何PHP程序:

   ProxyPassMatch^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1

3.PHP的编译

 3.1 PHP工作基本介绍

    根据上述介绍,可知PHP的主要三大功能提供CGI接口、PHP解释器和PHP与数据库的连接,其中PHP的工作模式有两种一种是编译为appache的模块,另外一种是独立运行,但是在独立运行时,又可分为多种,因此PHP独立运行时,具体数据库连接编译分类如下:

    第一种:RPM安装的数据库与php在同一台服务器

    RPM安装的数据库与PHP在同一台服务器时,此时数据库编译时,数据库连接编译方式采用如下选项

--enable-mysqlnd

--with-pdo-mysql=mysqlnd

--with-mysqli=mysqlnd

    第二种:RPM安装的数据库与PHP不在同一台服务器

    RMP安装的数据库与PHP不在同一台服务器时,此时数据库编译时,数据库连接编译方式采用如下选项,因为当指定数据库安装位置时,无法找到头文件等相关源码程序:

--enable-mysqlnd

--with-pdo-mysql=mysqlnd

--with-mysqli=mysqlnd

   第三种:二进制安装数据库与PHP在同一台服务器

    二进制安装数据库时,需指定二进制数据库的安装的具体目录,因此PHP连接数据库时,可以调用数据库程序中的数据库连接工具,因此连接数据库编译方式可以采用如下方式:

--with-mysql=/usr/local/mysql

--with-mysqli=/usr/local/mysql/bin/mysql_config

   第四种:二进制安装数据库与PHP不在同一台服务器

    二进制安装数据库与PHP不在同一台服务器时,只能调用mysqlnd连接模块,因为无法调用二进制安装数据库的连接数据库程序,因此只能选择连接模块:

--enable-mysqlnd

--with-pdo-mysql=mysqlnd

--with-mysqli=mysqlnd

    另外根据上述架构图中可以PHP具有承上启下的作用,位置举足轻重,上面讲述了编译过程中与数据库的关系,当然和apache关系也同样重要,具体也可以分为三类,具体如下

    第一种:APACHE与PHP模块化结合工作方式

    当APACHE与PHP模块化结合工作时,无PHP相关进行,因此httpd服务器处理php的动态程序时,httpd内部进程中已将动态程序处理。

    第二种:APACHE与PHP-FPM结合工作方式,且二者在同一台服务器

    当APACHE与PHP-FMP结合公时,httpd进程接受处理php的动态程序时,要转交给fpm进程进行处理,因此需要httpd服务器加载代理模块、支持PHP处理程序和指向具体代理进程,具体apache参考程序如:

centos6.9]vim /etc/httpd/conf/httpd.conf

LoadModule proxy_module modules/mod_proxy.so         #确保开启

LoadModule proxy_fcgi_module  modules/mod_proxy_fcgi.so #确保开

addtype application/x-httpd-php  .php     

addtype  application/x-httpd-php-source .php

DirectoryIndex   index.php

ProxyRequests  off

ProxyPassMatch ^/(.*\.php)$   fcgi://127.0.0.1:9000/var/www/html/$1 #PHP在本机

    第三种:APACHE与PHP-FPM结合工作方式,且二者不在同一台服务器

   当APACHE与PHP-FPM结合工作时,且二者不在同一台服务器时,此时httpd服务器接受的PHP的动态请求时,服务器要将此请求跳转到PHP解释器和PHP程序所在的服务器

LoadModule proxy_module modules/mod_proxy.so         #确保开启

LoadModule proxy_fcgi_module  modules/mod_proxy_fcgi.so #确保开

addtype application/x-httpd-php  .php     

addtype  application/x-httpd-php-source .php

DirectoryIndex   index.php

ProxyRequests  off

ProxyPassMatch ^/(.*\.php)$   fcgi://192.168.1.1:9000/var/www/html/$1  #PHP在其他主机

    PHP-FPM服务器配置,此时要开启监听所有IP地址和允许具体IP地址可以访问

Listen = 9000       #确保开启

;listen.allowed_clients =  127.0.0.1

 3.2 PHP的模块编译

    将PHP编译为httpd的模块时,需要注意要根据PHP的功能进行开启响应的功能,具体编译过程可参考如下示例:

centos7.3]#yum install libxml2-devel bzip2-devel libmcrypt-devel

centos7.3]#tar xvf php-7.1.10.tar.xz

centos7.3]#cd php-7.1.10/

第一步:配置编译环境

centos6.9]./configure \

--prefix=/app/php \                       #配置安装目录

--enable-mysqlnd \                        #开启连接数据库功能 

--with-mysqli=mysqlnd \                   #开启连接数据库的支持方式msyqli

--with-openssl \                          #开启支持认证

--with-pdo-mysql=mysqlnd \                #开启连接数据库的支持方式pdo

--enable-mbstring \

--with-freetype-dir \

--with-jpeg-dir \

--with-png-dir \

--with-zlib \

--with-libxml-dir=/usr \

--enable-xml \

--enable-sockets \                       

--with-apxs2=/app/httpd24/bin/apxs \      #安装为模块方式运行

--with-mcrypt \

--with-config-file-path=/etc \

--with-config-file-scan-dir=/etc/php.d \

--enable-maintainer-zts \

--disable-fileinfo

第二步:编译安装

centos7.3]#make -j 4 &&  make install

第三步:复制PHP引擎配置文件

centos7.3]#cp php.ini-production /etc/php.ini

 3.3 PHP的FPM编译

   将PHP编译为FPM的独立运行进程时,需要注意要根据PHP的功能进行开启响应的功能,具体编译过程可参考如下示例:

centos6.9]yum install libxml2-devel bzip2-devel libmcrypt-devel

centos6.9]tar xvf php-5.6.31.tar.xz

centos6.9]cd php-5.6.31

第一步:配置编译环境

centos6.9]./configure \

--prefix=/app/php5 \

--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 \                         #将PHP编译为FPM独立进程格式

--with-mcrypt \

--with-config-file-path=/etc/php5 \

--with-config-file-scan-dir=/etc/php5.d \

--with-bz2

第二步:编译安装

centos6.9]make -j 4 && make install

第三步:配置环境变量

centos6.9]vi /etc/profile.d/lamp.sh    #调整系统环境变量

PATH=/app/php5/bin:/app/httpd24/bin/:/usr/local/mysql/bin/:$PATH

centos6.9]. /etc/profile.d/lamp.sh

第四步:配置php引擎配置文件

centos6.9]mkdir /etc/php5/

centos6.9]cp php.ini-production /etc/php5/php.ini          #创建php的基本参数配置文件

第五步:配置php启动脚本并添加至服务

centos6.9]cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm   #创建启动脚本

centos6.9]chmod +x /etc/init.d/php-fpm                    

centos6.9]chkconfig --add php-fpm

centos6.9]chkconfig --list   php-fpm

第六步:配置PHP-fpm配置文件

centos6.9]cd /app/php5/etc                                 #创建fpm的基本参数配置文件

centos6.9]cp php-fpm.conf.default php-fpm.conf

第七步:修改php-fpm.conf配置文件

centos6.9]vim /app/php5/etc/php-fpm.conf

listen = 9000

第八步:启动服务

centos6.9]service php-fpm start

注意:各位互联网界的网友们,再参考此文档时要注意系统的版本和软件的版本

#######################################################################################

###具体详情请咨询微信:QQ767743577  邮箱地址: xuewei_bo@126.com,有问必答,有答必应,人人为我,我为人人###

#######################################################################################