lnmp架构(一)——lnmp工作原理(基础篇)、Nginx+FastCGI运行原理
文章目录
- 一、lnmp集群——基础知识篇
- 1.1 什么是lnmp?
- 1.2 lnmp工作原理
- 1.3.CGI介绍
- 1.4 什么是Fast-CGI?
- 1.5 Fast-CGI的工作原理
- 1.6 PHP-FPM是什么?
- 1.7 PHP-CGI是什么?
- 1.8 Nginx+FastCGI运行原理
一、lnmp集群——基础知识篇
1.1 什么是lnmp?
LNMP是目前网站主流架构之一,LNMP中L
指linux系统平台
,N
是nginx指网站的前端程序
,发布静态页面和调用外部程序解析动态页面,M
是mysql指网站的后台数据库
,P
是PHP指网页编程语言
,是作为一个独立服务存在的,这个服务叫做php-fpm
,Nginx直接处理静态请求,动态请求会转发给php-fpm
。
与LNMP对应的是LAMP,LAMP是指Linux、Apache、MySQL和PHP的结构体系。
1.2 lnmp工作原理
- 用户通过http协议发起请求,请求会先抵达LNMP架构中nginx
- nginx会根据用户的请求进行判断,这个判断是由Location完成的
- 判断用户请求的是静态页面,nginx直接进行处理
- 判断用户的请求是动态页面,nginx会将该请求交给fastcgi协议下发
- fastcgi会将请求交给php-fpm管理进程,php-fpm管理进程接收到后会调用具体的工作进程wrapper
- wrapper线程会调用php进行解析,如果只是解析php代码那公直接返回结果给客户端
- 如果有查询数据库的操作,则由php连接数据库(用户密码IP )然后发起查询的操作
- 最终数据由mysqI -> php -> php-fpm -> fastcgi ->nginx -> http -> user
通俗的说, 客户端的所有的页面请求先到达lnmp结构中的nginx,nginx根据自己的判断哪些是静态页面,哪些是动态页面,如果是静态页面直接由nginx自己处理就可以返回结果给客户端了,如果*.php动态页面nginx需要调用php中间件服务器处理,在处理PHP页面的过程中可能需要调用mysql数据库的数据完成页面编译,编译完成后的页面返回给nginx,nginx再返回给客户端。
- LAMP工作原理:
浏览器向服务发送http请求,服务器(Apache)接受请求,由于php作为Apache的组件模块也会一起启动,它们具有相同的生命周期。Apache会将一些静态资源保存,然后去调用php处理模块进行php脚本的处理。脚本处理完成后,Apache将处理完的信息通过http response的形式转送给浏览器。浏览器再进行解析与渲染然后进行呈现。 - 两者的区别 :
在LNMP
中,Nginx本身对脚本不做任何的处理,而是去调用一个PHP-FPM的进程,二者是相互独立的。nginx是把http请求变量转发给php进程,即php独立进程,与ngnix通信,这种方式叫做FastCGI运行方式。
在LAMP
中,PHP是Apache的一个模块,具有相同的生命周期。
所以,apache所编译的php不能用于ngnix。
1.3.CGI介绍
- CGI ( Common Gateway Interface),即通用网关接口,是WWW技术中最重要的技术之一, 是外*部应用程序(即CGI程序)与WEB服务器之间的接口标准,负责在CGI程序和Web服务器之间传递信息
- CGI是Web服务器运行时,调用外部应用程序(即CGI程序)的规范,CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器
- 出现背景
CGI是比较原始的开发动态网站的方式。由于静态的html页面无法实现网站的动态内容的生成,所以就需要由web务器调用CGI程序,CGI程序生成动态内容,返回给web服务器,web服务器再返回给浏览器。 - 功能:
CGI应用程序能通过Web服务器与浏览器进行交互,还可以通过数据库API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据,将数据格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中 - CGI程序处理步骤
1 浏览器通过HTML表单或超链接,请求指向一个CGI应用程序的URL
2 服务器收到浏览器发送的请求
3 服务器调用执行指定CGI应用程序;
4 CGI应用程序根据相关信息(通常是基于浏览者输入的内容)
5 CGI应用程序把操作结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页) ,并发送给web服务器
6 web服务器把操作结果返回给浏览器
1.4 什么是Fast-CGI?
**cgi**是 通用网关接口,是外部应用程序与Web服务器之间的接口标准,是为了保证web server传递过来的数据是标准格式的,方便cgi程序的编写者。Fast-CGI像是一个常驻(long-live)型的cgi
,是用来提高cgi程序性能的,是语言无关的、可伸缩架构的CGI开放扩展,主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。
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脚本。
1.5 Fast-CGI的工作原理
- Web Server启动时载入Fast-CGI进程管理器(IIS ISAPI或Apache Module)
- FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
- 当客户端请求到达Web Server时,Fast-CGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到Fast-CGI子进程php-cgi。
- 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)可以工作。
1.6 PHP-FPM是什么?
php-fpm:支持解析php的一个fastCGI进程管理器/引擎,是一个实现了Fastcgi的程序,管理对象是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更多进程,
A、如果prefork达到了pm.max_children上限,worker进程又全都繁忙,这时master进程会把请求挂起到连接队列backlog里(默认值是511).
1.7 PHP-CGI是什么?
php-cgi 是解释PHP脚本的程序,只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理
1.8 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的整个运作过程:
需要一个wrapper,这个wrapper需要完成的工作:
1、通过调用fastcgi(库)的函数通过socket和ningx通信(读写socket是fastcgi内部实现的功能,对wrapper是非透明的)
2、调度thread,进行fork和kill
3、和application(php)进行通信
还没有评论,来说两句吧...