LNMP与LAMP框架的简介及原理

LAMP=Linux+Apache+Mysql+PHP
LNMP=Linux+Nginx+Mysql+PHP

LNMP架构简介
1.LNMP架构的基本定义


2.LNMP架构的深层剖析
Nginx

NGinx是一款高性能的web服务器,本身是不能处理php请求的,当接收到请求时,判断如果是php请求就会将请求交给php解析器处理然后将结果返回给client。Nginx一般把请求转发给fast-cgi管理进程进行处理,fast-cgi管理进程再选择cgi子进程处理请求,然后把结果返回给Nginx。

Apache+php和nginx+php的区别:

apache一般是把php当作自己的一个模块来启动;而nginx则是把http请求变量转发给php进程,即php独立进程,与Nginx通信,这种方式叫做fast-cgi运行方式,所以apache编译的php不能用于nginx。

Fast-Cgi:

Fast-Cgi是一个可伸缩的,高速的HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持fast-cgi,包括apache,nginx和lighttpd等。同时fast-cgi也被许多脚本语言支持,其中就有php。Fast-CGI是从CGI发展改进而来的。传统的CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来进行解析,然后将结果返回给http服务器。这里在处理高并发访问时几乎是不可用的。另外传统的CGI接口接口方式的安全性也很差,现在已经很少使用了。

Fast-CGI接口方式采用C/S结构,可以将http服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析器守护进程。当HTTP服务器每次遇到动态程序时,可以直接将其交给Fast-CGI进程来执行,然后将的得到的结果再返回给浏览器。这种方式可以让HTTP服务器专一的处理静态请求或者将动态脚本服务器的结果返回给客户端。这再很大程度上提高了应用程序的性能。

Nginx+Fast-CGI的运行原理:

Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过fast-cgi接口来调用。Fast-cgi接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。 wrapper:为了调用CGI程序,还需要一个Fast-cgi的wrapper(wrapper也可以理解为用于启动另外一个程序的程序),这个wrapper绑定在某个固定的socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候通过Fast-CGI的接口,wrapper接收到一个请求,然后fork派生出一个新的线程,这个线程调用解析器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过Fast-cgi接口,沿着固定的socket传递给Nginx;最后Nginx将返回的数据(html页面或者图片)发送给客户端。
下图为Nginx+Fast-CGI的整个运行过程:


因此,首先需要一个wrapper,这个wrapper需要完成的工作:
(1)通过调用Fast-CGI(库)的函数通过socket和Nginx通信(读写socket是fast-cgi内部实现的功能,对wrapper是非透明的)
(2)调度thread,进行fork和application进行通信。

php-fpm简述:

PHP-FPM是一个PHP FastCGI管理器,是只用于php的,它其实是php源代码的一个补丁,旨在将Fast-CGI进程管理整合进PHP包中。必须将它patch到你的源代码中,在编译安装php后才可以使用。新版的PHP已经集成了php-fpm,在./configure的时候带–enable-fpmp参数即可开启PHP-FPM。

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


LAMP是一个多C/S架构的平台,最初级为web客户端基于TCP/IP通过http协议发起传送,这个请求可能是静态的也可能是动态的。所以web服务器通过发起请求的后缀来判断,如果是静态的就由web服务器自行处理,然后将资源发给客户端。如果是动态的web服务器会通过CGI(Common Gateway Interfence,通用网关接口)协议发起给php。这里但是如果php以模块形式与web服务器联系,那么它们是通过内部共享内存的方式,如果是php单独的放置于一台服务器,那么它们是以sockets套接字的方式进行通信(这又是一个C/S架构),这时php会相应的执行一段程序,如果在程序执行时需要一些数据,那么php就会通过 mysql协议发送给mysql服务器(这也可以看作是一个C/S架构),由mysql服务器处理,将数据供给php程序。
apache主要实现如下功能
第一:处理http的请求、构建响应报文等自身服务;
第二:配置让Apache支持PHP程序的响应(通过PHP模块或FPM);
第三:配置Apache具体处理php程序的方法,如通过反向代理将php程序交给fcgi处理。

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

php主要实现如下功能
第一:提供apache的访问接口,即CGI或Fast CGI(FPM);
第二:提供PHP程序的解释器;
第三:提供mairadb数据库的连接函数的基本环境。

由此可知,要实现LAMP在配置每一个服务时,安装功能需求进行配置,即可实现LAMP的架构,当然apache、mariadb和php服务都可配置为独立服务,安装在不同电脑之上。
LAMP和LNMP的区别
1.LNMP方式的优点:占用VPS资源较少,Nginx配置起来也比较简单,利用fast-cgi的方式动态解析PHP脚本。缺点:php-fpm组件的负载能力有限,在访问量巨大的时候,php-fpm进程容易僵死,容易发生502 bad gateway错误。
2.基于 LAMP 架构设计具有成本低廉、部署灵活、快速开发、安全稳定等特点,是 Web 网络应用和环境的优秀组合。若是服务器配置比较低的个人网站,当然首选 LNMP 架构。当然,在大流量的时候。把Apache和Nginx结合起来使用,也不失为一个不错选择。
3.LNMP架构里php会启动服务php-fpm,而LAMP中php只是作为Apache的一个模块存在。Nginx会把用户的动态请求交给php服务去做处理,这个php服务就会去和数据库进行交互。用户的静态请求Nginx会直接处理,Nginx处理静态请求的速度要比Apache快很多性能上要好,所以apache和Nginx在动态请求处理上区别不大,但是如果是静态处理的话就会发现Nginx要快于apache,而且Nginx能承受的并发量要比apache大,可以承受好几万的并发连接量,所以大一些的网站都会使用Nginx作为web服务器。
————————————————
版权声明:本文为CSDN博主「且听风吟zyw」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/even160941/article/details/97256516

posted @ 2021-03-08 10:42  大厨无盐煮  阅读(520)  评论(0编辑  收藏  举报