前言: 当浏览器发送index.php文件时,Nginx或者Apcache无法解析浏览器发过来的html或者.php或者.py的文件,那中间就需要有个解析器来解析浏览器发过来的文件,php有php的解析器,python有python的解析器,那就是靠着各个开发语言的解析器来处理浏览器发送的动态文件请求的。
如果客户端请求的是index.html的这类静态页面,那么Web Server就去文件系统中找对应的文件,找到就返回给客户端–>一般是浏览器。 但是如果请求的是index.php这种动态页面,那么Web Server根据配置文件知道这个不是静态文件,就会调用php解析器进行处理然后将返回的数据转发给客户端;
大体流程则为:
在整个过程中,Web Server并不能直接处理静态或者动态请求,对于静态请求是查找然后返回数据或者报错信息;对于动态数据则交给php解析器【php-cgi】进行处理;
就有下面所说的 CGI;
定义:(Common Gateway Interface)“通用网关接口”,是一种让客户端(浏览器)与Web Server(nginx,apache) 进行通信(数据传输)的协议; CGI是为了保证Web Server传递过来的数据是标准格式的。 工作原理 1、每次当Web Server收到index.php这种类型的动态请求后,会启动对应的CGI程序管理(php-cgi); 2、php解析器会解析php.ini配置文件,初始化运行环境,然后处理请求,处理完成后将数据按照CGI规定的格式返回给Web Server 然后退出进程; 3、最后Web Server 再把结果返回给浏览器
CGI的一个进程处理完一个请求后退出,下一个请求来时再创建新进程; 特点 1、高并发性能比较差:CGI程序的每一次web请求都会有启动和退出过程,也就是最为人诟病的fork-and-execute模式(每次HTTP服务器遇到动态请求时都需要重新启动脚本解析器来解析php.ini,重新载入全部DLL扩展并初始化全部数据结构,然后把结果返回给HTTP服务器),很显然,这种在处理高并发的时候是不可用的 应用领域 因为CGI为每一次请求增加一个进程,效率很低,所以基本已经不在生产部署时采用。但由于CGI对php配置的敏感性,通常被用在开发和调试阶段。
CGI程序性能差,又不能接受高并发带来的请求,为了解决这些问题就有了FastCGI;
定义:FastCGI:(Fast Common Gateway Interface) “快速通用网关接口”,也是一种让交互程序与Web服务器通信的协议;FastCGI致力于减少网页服务器与CGI程序之间互动的开销,从而提高并发访问;
工作原理 1、Web Server启动同时,加载php-fpm【很多人会说FastCGI进程管理器(nginx的php-fpm)】; 2、php-fpm 读取php.ini配置文件,对自身进行初始化,启动多个CGI解释器进程(php-cgi),等待来自Web Server的链接; 3、当Web Server接收到客户端的请求时,php-fpm选择并链接一个CGI解释器,Web Server会将相关环境变量和标准输入到php-cgi进行处理 4、最后php-cgi完成处理后将数据按照CGI规定的格式返回Web Server,然后关闭子进程等待下一次请求;
管理方式 FastCGI会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker.当请求过来时,master会传递给一个worker,然后立即接受下一个请求。这样就避免了重复的劳动。而当worker不够用时,master可以根据配置预先启动几个worker,当空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是FastCGI对进程的管理。
接口方式 C/S,将web服务器和脚本解析服务器分开,独立于web服务器运行,提高web服务器的并发性能和安全性
提高性能:这种方式支持多个web分发服务器和多个脚本解析服务器的分布式架构,同时可以再脚本解析服务器上启动一个或者多个脚本解析守护进程来处理动态请求,可以让web服务器专一的处理静态请求或者动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能
所有的配置加载都只在FastCGI进程启动时发生一次,每次修改php.ini配置文件,只需要重启FastCGI程序(php-fpm)即可完成平滑重启新配置,已有的动态请求会继续处理,吹完成关闭进程,新来的请求使用新加载的配置和变量进行处理
特点 FastCGI 像是一个常驻的CGI,维护的是一个进程池,它可以一直执行,只要激活后,就不会每次都花费时间去fork一次。
缺点 FastCGI会在内存中同时运行多进程,所以肯定会比CGI方式消耗更多的服务器内存,所以在优化配置php-cgi进程池的数量时要注意系统内存,防止过量。
php-fpm 定义:是一个实现了FastCGI的程序。 php的解释器是php-cgi,php-cgi只是CGI的程序,它自己本身只能解析请求,返回结果,但是并不会管理进程,所以就出现了一些能够调度php-cgi进程的程序,php-fpm;
php-fpm的管理对象是php-cgi,但不能说php-fpm是FastCI进程的管理器。
修改了php.ini的配置文件后,没办法平滑重启,需要重启php-fpm才可以
php-fpm会开启多个php-cgi程序,并且php-fpm常驻内存,每次web server服务器发来的时候,php-fpm将连接信息分配给下面其中的一个php-cgi来进行处理,处理完php-cgi也不会关闭,会继续等待下一个链接,这也是fast-cgi加速的原理。
|