LAMP和LNMP架构(介绍)

目录

      • 工作原理
      • 架构介绍
        • LAMP架构介绍
        • LNMP架构介绍
      • LAMP LNMP差别

工作原理

LAMP

浏览器向服务器发送http请求,服务器 (Apache) 接受请求,由于php作为Apache的组件模块也会一起启动,它们具有相同的生命周期。Apache会将一些静态资源保存,然后调用php去处理模块进行php脚本的处理。脚本处理完后,Apache将处理完的信息通过http response的方式发送给浏览器,浏览器解析,渲染等一系列操作后呈现整个网页。

LNMP

浏览器发送http request请求到服务器(Nginx),服务器响应并处理web请求。如果是静态文本直接返回,否则将脚本(PHP)通过接口传输协议(网关协议)PHP-FCGI(fast-cgi)传输给PHP-FPM(进程管理程序),然后PHP-FPM调用PHP解析器的其中一个进程PHP-CGI来解析php脚本信息。【PHP-FPM在启动时启动了多个PHP-CGI子进程,并发执行。】然后将解析后的脚本返回到PHP-FPM,PHP-FPM再通过fast-cgi的形式将脚本信息传送给Nginx。服务器再通过Http response的形式传送给浏览器。浏览器再进行解析与渲染然后进行呈现。


架构介绍

LAMP架构介绍

LAMP和LNMP架构(介绍)_第1张图片
现如今打开浏览器,搜索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组合的架构,架构图如下:
LAMP和LNMP架构(介绍)_第2张图片
根据上图中访问数据流可知,处理一次动态页面请求,服务器主要经历:Apache处理请求——通过CGI接口访问PHP的的应用程序——PHP应用程序调用PHP解释器执行PHP代码——PHP程序访问调用数据库——最后给客户做反馈

故在LAMP的环境机构中,apache、mariadb和php的主要功能分别如下。
LAMP和LNMP架构(介绍)_第3张图片
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服务都可配置为独立服务,安装在不同服务器之上。

LNMP架构介绍

LNMP代表的就是:Linux+Nginx+MySQL+PHP这种网站服务器架构。

  • Linux:是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。代表版本有:debian、centos、ubuntu、fedora、gentoo等
  • Nginx:是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器
  • Mysql:是一个中小型关系型数据库管理系统
  • PHP:是一种在服务器端执行的嵌入HTML文档的脚本语言

这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统。
LAMP和LNMP架构(介绍)_第4张图片
和之前提到的LAMP唯一不同的是,LNMP中的N指的是Nginx(类似于Apache的一种web服务软件)。目前这种环境的应用也非常多。Nginx设计的初衷是提供一种快速、高效、多并发的Web服务软件

在静态页面的处理上,Nginx较Apache更胜一筹,但在动态页面的处理上,Nginx并不比Apache有优势。但是目前还是有很多爱好者对Nginx比较热衷。随着Nginx技术的不断成熟,它在Web服务软件领域的地位也会越来越高。并且php是作为一个独立服务存在的,这个服务叫做php-fpm。Nginx直接处理静态请求,动态请求会转发给php-fpm。

Nginx详细介绍

Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为 “engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。

为什么Nginx的性能要比Apache高得多?这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的 Squid、Memcached都采用的是epoll网络I/O模型。处理大量的连接的读写,Apache所采用的select网络I/O模型非常低效。

下面用一个比喻来解析Apache采用的select模型和Nginx采用的epoll模型进行之间的区别:假设你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。select版宿管大妈就会带着你的朋友挨个房间去找,直到找到你为止。而epoll版 宿管大妈会先记下每位同学的房间号,你的朋友来时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满大楼找人。如果来了10000个人,都要 找自己住这栋楼的同学时,select版epoll版宿管大妈,谁的效率更高,不言自明。同理,在高并发服务器中,轮询I/O是最耗时间的操作之一,select和epoll的性能谁的性能更高,同样十分明了。

在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。Nginx 0.8.46 + PHP 5.2.14 (FastCGI) 可以承受3万以上的并发连接数,相当于同等环境下Apache的10倍。

lnmp 各模块协作图
LAMP和LNMP架构(介绍)_第5张图片
Fast-CGI 介绍

cgi是通用网关接口,是外部应用程序与Web服务器之间的接口标准,cgi是为了保证web server传递过来的数据是标准格式的,方便cgi程序的编写者。

Fast-CGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。

Fast-cgi像是一个常驻(long-live)型的cgi,是用来提高cgi程序性能的。

fast-CGI是nginx和php之间的一个通信接口,该接口实际处理过程通过启动php-fpm进程来解析php脚本,即php-fpm相当于一个动态应用服务器,从而实现nginx动态解析php。因此,如果nginx服务器需要支持php解析,需要在nginx.conf中增加php的配置;将php脚本转发到fastCGI进程监听的IP地址和端口(php-fpm.conf中指定)。同时,php安装的时候,需要开启支持fastCGI选项,并且编译安装php-fpm补丁/扩展,同时,需要启动php-fpm进程,才可以解析nginx通过fastCGI转发过来的php脚本。

Fast-CGI的工作原理

  1. Web Server启动时载入Fast-CGI进程管理器(IIS ISAPI或Apache Module)
  2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
  3. 当客户端请求到达Web Server时,Fast-CGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到Fast-CGI子进程php-cgi。
  4. Fast-CGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当Fast-CGI子进程关闭连接时,请求便告处理完成。Fast-CGI子进程接着等待并处理来自Fast-CGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。

在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用Fast-CGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

Fast-CGI的不足

因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。

Nginx 0.8.46+PHP 5.2.14(FastCGI)服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M10=150M),开启的64个php-cgi进程消耗1280M内存(20M64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。

上面的数据摘自Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)

PHP-FPM

PHP-FPM是一个实现了Fastcgi的程序,PHP-FPM的管理对象是php-cgi。被PHP官方收了。
后来PHP内核集成了PHP-FPM之后就方便多了,使用–enalbe-fpm这个编译参数即可。

1.php-fpm是一个完全独立的程序,不依赖php-cgi,也不依赖php。因为php-fpm是一个内置了php解释器的FastCGI服务,启动时能够自行读取php.ini配置和php-fpm.conf配置。

2.一个master进程,支持多个pool,每个pool由master进程监听不同的端口,pool中有多个worker进程。

3.每个worker进程都内置PHP解释器,并且进程常驻后台,支持prefork动态增加。

4.每个worker进程支持在运行时编译脚本并在内存中缓存生成的opcode来提升性能。

5.每个worker进程支持配置响应指定请求数后自动重启,master进程会重启挂掉的worker进程。

6.每个worker进程能保持一个到MySQL/Memcached/Redis的持久连接,实现"连接池",避免重复建立连接,对程序透明。

7.master进程采用epoll模型异步接收和分发请求,listen监听端口,epoll_wait等待连接。

8.然后分发给对应pool里的worker进程,worker进程accpet请求后poll处理连接。

9.如果worker进程不够用,master进程会prefork更多进程。

10.如果prefork达到了pm.max_children上限,worker进程又全都繁忙,这时master进程会把请求挂起到连接队列backlog里(默认值是511)。

PHP-CGI

php-cgi 是解释PHP脚本的程序,只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理

Nginx+FastCGI运行原理

nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。

wrapper: 为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后Fork(派生)出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据(html页面或者图片)发送给客户端。这就是Nginx+FastCGI的整个运作过程,
LAMP和LNMP架构(介绍)_第6张图片
所以,我们首先需要一个wrapper,这个wrapper需要完成的工作:

  1. 通过调用fastcgi(库)的函数通过socket和ningx通信(读写socket是fastcgi内部实现的功能,对wrapper是非透明的)
  2. 调度thread,进行fork和kill
  3. 和application(php)进行通信

LAMP LNMP差别

  1. apache一般是把php当作自己的一个模块来启动;而nginx则是把http请求变量转发给php进程,即php独立进程,与Nginx通信,这种方式叫做fast-cgi运行方式,所以apache编译的php不能用于nginx。
  2. LNMP中,Nginx本身对脚本不做任何的处理,而是把请求发fast-cgi管理进程处理,fast-cgi管理进程选择cgi子进程处理结果并返回,二者是相互独立的,通过管道进程通信。
  3. LAMP中,PHP是Apache的一个模块,具有相同的生命周期。两者通过共享内存的方式通信。

两者的PHP环境不相互适用

相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率

你可能感兴趣的:(LNMP,LAMP)