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组合的架构,架构图如下:
图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配置在同一台服务器中,而且不会作物独立的程序或进程运行,工作架构图如下:
图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模块化工作结构,具体如下所示:
图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的基本环境)进行协调配置承上启下的功能配置,具体结构如下图:
图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 #确保开启 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 邮箱地址: [email protected],有问必答,有答必应,人人为我,我为人人###
#######################################################################################