php-fpm, nginx ,fastcgi ,php-cgi 关系粗解

时间:2022-06-27 08:05:39

首先,CGI 是干什么的?  CGI 是为了保证web server传递过来的数据是标准格式。CGI  是个协议和 进程没什么关系。

CGI 是http服务器于你的本机或者其他电脑上的程序交谈的一种工具。其程序必须运行在网络服务器上。

fastcgi  是一个与平台和语言无关的接口。只要按照它本身的接口来调用 都能实现语言和web service的通信。

CGI处理步骤:

1用户通过internet 把用户请求发送到服务器。

2 服务器接受到用户请求并交给cgi程序处理。

3cgi 程序吧处理结果传送给服务器。

4服务器吧结果送回到用户。

但是cgi 每次满次请求之后都会被杀死该进程。 因为cgi每次请求的时候先创建 之后处理请求 在再被杀死。 而fastcgi 则是创建之后 不会被杀死 在等待下一次的请求。  

————————————————

 

用户请求分静态请求和动态请求。比如:html  就是静态   。php  就是动态请求

web server(如nginx)  只是内容的分发着。如果请求一个 index.html 那么web server 回去页面中找到

这个文件,并返回给浏览器。这里的分发是静态数据。

 

 PHP 的解释器是 php-cgi,它只是个 CGI 程序,只能解析请求,返回结果.

动态请求:请求一个 index.php

当nginx 接收到一个 http 请求的时候  通过配置文件找到对应的服务(location),location再找到对应的配置如:

php-fpm, nginx ,fastcgi ,php-cgi 关系粗解

找到以.php结尾的文件的请求交给  127.0.0.1:9000 去处理。这里 的ip 和端口就是fastCGI 进行监听的ip和端口。fastcgi 进行请求处理。再通过nginx 返回给客户端。

补充一下: fastcgi  像是cgi的升级版。 当fastcgi 被调用时 会初始化多个CGi(如果是php的文件 则启动多个php-cgi解析器),等待请求 .当有请求处理完的时候 CGI(这里是php文件so 就是php-cgi)处理完成后会被杀死。 而fastcgi 会继续等待下一次请求。周而复始。。。

 

php-fpm 是一个实现了fastcgi的管理

大家都知道php 的解析器是php-cgi php-cgi只是CGI的一个程序。他本身只能解析请求,返回结果。不会进程管理。所以出现了一些

调度php进程的管理 例如 php-fpm。就是这样的。

nginx  本身不会对php 进行解析。当有php  请求的时候 nginx 会把 调用 fastcgi进程来监听地址和 端口。 php-fpm来 动态解析服务器处理 返回给ngixn .

php-fpm 是管理进程的fastcgi的。

Nginx 的反向服务代理   就是当php有动态请求的时候将 动态请求交给 php-fpm  从而实现了 动态解析了php.php-fpm, nginx ,fastcgi ,php-cgi 关系粗解

*******关于fastcgi 是CGI的升级版 或者 优化版的说法我也整理了些资料 大家看看 有什么不对的请指出。

php-cgi 的缺点

1.php-cgi 边个php.ini 后 需要重启php-cgi  才能生效。不能平滑重启

2. php-cgi 被杀死以后就php 就不能使用了。

 php-cgi 接收到请求后,初始化环境 初始化php.ini. 处理请求。返回数据。

首先,fastCgi 会先启一个 master,解析配置文件,初始化执行环境,然后再启动多个 worker。当请求过来时,master 会传递给一个 worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当 worker 不够用时,master 可以根据配置预先启动几个 worker 等着;当然空闲 worker 太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是 fastCgi 对进程的管理。

 

 

 

 

本文 (一部分)转载于:https://segmentfault.com/q/1010000000256516