fast cgi (fast common gateway interface 快速通用网关接口),为了解决频繁实例化和销毁cgi进程而导致的大量性能消耗的矛盾,设计了fast cgi协议。为了行文方便,下文中我们将fast cgi称之为fcgi。
首先和cgi相同,fcgi的本质也是一种协议,他规定了一种新的和web server通信的标准。任何语言都可以按照fcgi的协议进行实现,此实现则称之为fcgi程序或者fcgi脚本。以php为例,php-fpm则是fcgi在php下的实现。在fcgi协议中规定,web server将和fcgi程序通过tcp建立长连接(其实除了tcp之外,fcgi协议也提供了其他的通信方式,比如socket、管道等,这里以tcp为例讲解),由fcgi实例来管理处理不同请求的子进程,并且维护这些进程的生命周期。一般来讲fcgi程序都会实现一个进程池,进程池中的每个进程在一个生命周期中将处理多个http请求。从这个角度上理解,fcgi的核心是一个进程管理器,web server不再做不断的实例化cgi进程的工作,而是将此工作交给fcgi实例来实现和管理,这样就避免了频繁的初始化和销毁过程,降低性能消耗。从工作方式来讲fcgi程序也是一个tcp服务器,他将监听一个tcp端口,来接受web server的请求,然后通过tcp将处理结果返回给web server。
下面通过一个http请求实例来说明fcgi的工作流程,同样用php为例。
首先应该启动fcgi实例(上文中也说过,fcgi实例其实是一个tcp服务器),这里是php-fpm。fcgi实例化的时候会建立一个master进程,解析配置文件(php.ini),初始化执行环境,同时也会初始化配置文件中指定数量的worker进程,这些进程保持活跃,等待请求。
当浏览器发送一个http请求到web server(此处以nginx为例),命中nginx中配置的接管路由后nginx将会建立php-fpm的tcp连接,并且将http参数传递给fcgi进程,此时fcgi实例的master进程将会分配此请求给worker进程池中的某个进程,开始处理业务,处理完毕之后将结果返回给master,进而通过tcp连接返回给web server。
从上面的工作流程中可以理解:修改了php.ini配置文件后,需要重启php-fpm服务才可使用新的配置。此时新创建的worker会用新的配置,已经存在的worker继续处理完手上的活。
通过《CGI——web server实现动态请求的传统基础协议》和本文,从理论层面讲解了cgi和fcgi的概念以及工作流程,接下来会从实际应用中来讲解nginx和php-fpm在实际应用中的一些配置,通过理论和实践结合深化理解。
热门评论