Lnmp(一)对lnmp架构的理解

LNMP的概念:

LNMP代表的就是:Linux+Nginx+MySQL+PHP这种网站服务器架构。
•    Linux:是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。代表版本有:debian、centos、ubuntu、fedora、gentoo等。
•    Nginx:是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
•    Mysql:是一个中小型关系型数据库管理系统
•    PHP:是一种在服务器端执行的嵌入HTML文档的脚本语言
这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统。

 

LNMP结构框图:

Lnmp(一)对lnmp架构的理解

lnmp和lamp的工作原理:

    (1)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的形式传送给浏览器,浏览器再进行解析与渲染然后进行呈现。

    (2)lamp的工作原理

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

LAMP和LNMP区别是什么?

lamp=linux+apache+mysql+php
lnmp=linux+nginx+mysql+php
LAMP指的是:Linux+Apache+MySQL+Perl/PHP/Python
由于Nginx拥有超越Apache的卓越性能,LNMP正在逐渐取代LAMP
在LNMP中Nginx本身对脚本不做任何的处理,而是把请求发给fast-cgi管理进程处理
fast-cgi管理进程选择cgi子进程处理结果并返回,二者是相互独立的,通过管道进程通信
在LAMP中PHP是Apache的一个模块,具有相同的生命周期,两者通过共享内存的方式通信
两者的PHP环境不相互适用
相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率

刚才说到了fast-cgi和nginx,显而易见,nginx就是lnmp架构的核心。那么fsta-cgi又是什么呢?

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

Lnmp(一)对lnmp架构的理解

Lnmp(一)对lnmp架构的理解

lnmp的特点(主要是nginx)

    Nginx是一个小巧而高效的Linux下的Web服务器软件,是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler 站点开发的
    已经在一些俄罗斯的大型网站上运行多年,相当的稳定
    nginx优点:Nginx性能稳定、功能丰富、运维简单、处理静态文件速度快且消耗系统资源极少
    作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率
    作为负载均衡服务器:Nginx 既可以在内部直接支持Rails和PHP,也可以支持作为 HTTP代理服务器对外进行服务
    Nginx 用C编写,不论是系统资源开销还是CPU使用效率都比Perlbal要好的多
    作为邮件代理服务器:Nginx同时也是一个非常优秀的邮件代理服务器
    (最早开发这个产品的目的之一也是作为邮件代理服务器),Last/fm 描述了成功并且美妙的使用经验
    Nginx 安装非常的简单,配置文件非常简洁(还能够支持perl语法)
    Nginx支持平滑加载新的配置,还能够在不间断服务的情况下进行软件版本的升级

lnmp架构处理两种网页的过程:(linux+nginx+mysql+php)

  •      静态网页:用户要什么,服务器就找什么,并且将找到的数据返还给用户
  •      动态网页:用户要页面,服务器识别脚本,在服务器端执行脚本,然后将处理结果返还给用户。

 

关于fast-cgi:fast-cgi属于php的一个模块

PHP支持的模块

FastCGI的工作原理是

(1)、Web Server启动时载入FastCGI进程管理器【PHP的FastCGI进程管理器是PHP-FPM(php-FastCGI Process Manager)】(IIS ISAPI或Apache Module);

(2)、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。

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

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

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

 

Fastcgi的优点:

1)从稳定性上看, fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分 配新的进程来运行逻辑.

2)从安全性上看,Fastcgi支持分布式运算. fastcgi和宿主的server完全独立, fastcgi怎么down也不会把server搞垮.

3)从性能上看, fastcgi把动态逻辑的处理从server中分离出来, 大负荷的IO处理还是留给宿主server, 这样宿主server可以一心一意作IO,对于一个普通的动态网页来说, 逻辑处理可能只有一小部分, 大量的图片等静态 

FastCGI缺点:说完了好处,也来说说缺点。从我的实际使用来看,用FastCGI模式更适合生产环境的服 务器。但对于开发用机器来说就不太合适。因为当使用 Zend Studio调试程序时,由于 FastCGI会认为 PHP进程超时,从而在页面返回 500错误。这一点让人非常恼火,所以我在开发机器上还是换回 了 ISAPI模式。

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的整个运作过程.
Lnmp(一)对lnmp架构的理解

 所以,我们首先需要一个wrapper,这个wrapper需要完成的工作
1、通过调用fastcgi(库)的函数通过socket和ningx通信(读写socket是fastcgi内部实现的功能,对wrapper是非透明的)
2、调度thread,进行fork和kill
3、和application(php)进行通信