CGI、FastCGI和php-fpm的概念和区别

1. LNMP架构工作流程

1.用户通过http协议发起请求,请求会先抵达LNMP架构中的nginx

2.nginx会根据用户的请求进行判断,这个判断是由Location完成的

3.判断用户请求的是静态页面,nginx直接进行处理

4.判断用户的请求是动态页面,nginx会将该请求交给fastcgi协议下发

5.fastcgi会将请求交给php-fpm管理进程,php-fpm管理进程接收到后会调用具体的工作进程wrapper

6.wrapper线程会调用php进行解析,如果只是解析php代码,那么直接返回结果给客户端

7.如果有查询数据库的操作,则由php连接数据库(用户 密码 IP )然后发起查询的操作

8.最终数据由 mysqI -> php -> php-fpm -> fastcgi ->nginx -> http -> user

在这里插入图片描述

2. CGI介绍

CGI ( Common Gateway Interface ),即通用网关接口,是WWW技术中最重要的技术之一,是外部应用程序(即CGI程序)与WEB服务器之间的接口标准,负责在CGI程序和Web服务器之间传递信息
CGI是Web服务器运行时,调用外部应用程序(即CGI程序)的规范,CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器

CGI程序的工作方式

Web服务器一般只处理静态文件请求(如 jpg、htm、html),如果碰到一个动态脚本请求(如php),web服务器主进程,就fork出一个新的进程来启动CGI程序,也就是说将动态脚本请求交给CGI程序来处理。启动CGI程序需要一个过程,比如,读取配置文件,加载扩展等。CGI程序启动后,就会解析动态脚本,然后将结果返回给Web服务器,最后Web服务器再将结果返回给客户端,刚才fork的进程也会随之关闭。

这样,每次用户请求动态脚本,Web服务器都要重新fork一个新进程,去启动CGI程序,由CGI程序来处理动态脚本,处理完后进程随之关闭。

这种工作方式的效率是非常低下的。
在这里插入图片描述
cgi是怎么执行动态请求的

web服务器接受到请求,然后根据内容,fork一个新进程,这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出,如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新进程。这个方式的问题在与每次请求都要新开一个进程,用完之后又要关闭,这是CGI最为人诟病的fork-and-execute 模式,效率上比较低

后来出现了一种更高级的方式,web服务器收到一个请求时,他不会重新fork一个进程(因为这个进程在web服务器启动时就开启了,而且不会退出),web服务器直接把内容传递给这个进程,这个进程收到请求后进行处理,把结果返回给web服务器,最后自己接着等待下一个请求的到来,而不是退出。 这就是fastcgi。效率上比cgi高很多
在这里插入图片描述

在这里插入图片描述

3. FastCGI

FastCGI就像是一个常驻(long-live)型的CGI程序,它可以一直运行着。FastCGI程序也可以和Web服务器分别部署在不同的主机上,它还可以接受来自其他Web服务器的请求。

FastCGI也是语言无关的。其主要行为是将CGI解释器进程保持在内存中并因此获得高效的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因。

FastCGI是一种进程管理工具,它可以在内存中管理CGI进程。

FastCGI进程管理器需要单独启动。启动FastCGI后,会生成一个FastCGI主进程和多个子进程(子进程其实就是CGI解释器进程)。

当客户端请求Web服务器上的动态脚本时,Web服务器会将动态脚本通过TCP协议交给FastCGI主进程,FastCGI主进程根据情况,安排一个空闲的子进程来解析动态脚本,处理完成后将结果返回给Web服务器,Web服务器再将结果返回给客户端。该客户端请求处理完毕后,FastCGI子进程并不会随之关闭,而是继续等待主进程安排工作任务。

由此可知,FastCGI的工作效率是非常高的。

在这里插入图片描述
FastCGI工作流程:

  1. Web服务器启动时,初始化FastCGI的程序执行环境。例如Nginx服务器对应的ngx_ http_fastcgi_ module模块
  2. FastCGl进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web服务器的连接
  3. 当客户端请求到达Web服务器时, Web服务器将该请求采用socket方式转发到FastCGI主进程,FastCGI 主进程选择并连接到一个CGI解释器(关联FastCGI子进程),然后,Web服务器将CGI环境变量和标准输入发送到FastCGl子进程。
  4. FastCGI子进程完成处理后,将标准输出和错误信息从同一socket连接返回给Web服务器。最后,FastCGI 子进程关闭与Web服务器之间的连接。
  5. FastCGI子进程继续等待并处理下一个来自Web服务器的连接

4. php-fpm

fpm是FastCGI Process Manager的缩写,那么,fpm就是FastCGI进程管理器的简称。

php-fpm就是php中的FastCGI进程管理器。

对于php5.3之前的版本来说,php-fpm是一个第三方的补丁包,旨在将FastCGI进程管理整合进PHP包中。

在php5.3之后的版本中,php-fpm不再是第三方的包,它已经被集成到php的源码中了。php-fpm提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以php-fpm被PHP官方收购了。

在这里插入图片描述