CGI(Common Gateway Interface)
中文名:公共网关接口
定义:CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。(CGI描述了服务器和请求处理程序之间传输数据的一种标准。)
功能:可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。
编程语言Perl是一个广泛被用来编写CGI程序的语言,但CGI的一个目的是要独立于任何语言的。事实上,CGI程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行。
工作方式:
1、使用你的浏览器访问URL并连接到HTTP web 服务器。
2、Web服务器接收到请求信息后会解析URL,并查找访问的文件在服务器上是否存在,如果存在返回文件的内容,否则返回错误信息。
3、浏览器从服务器上接收信息,并显示接收的文件或者错误信息。-
架构图 :
区别 CGI 和 CGI程序
CGI 是一种规范/协议, CGI程序是使用 CGI 规范编写出来的程序,例如(PHP解析器等)。
自己理解:
CGI 就是一种规范,它是用来规定web服务器和CGI程序(PHP解析器或者其他程序)交互时候的数据格式!
例如 用户通过浏览器访问页面的时候,那么这时候web服务( Nginx)就会根据url去找到指定的页面,页面如果是静态页面(index.html)则会直接解析。如果页面是动态页面(index.php),web服务就会去调用CGI程序(PHP解析器)来处理,这时候就需要传递参数给这个CGI程序(PHP解析器)如 url地址 、http header、POST/GET参数等,CGI就是规定要传送的这些数据和格式。
FastCGI(Fast Common Gateway Interface)
中文名: 快速通用网关接口。
定义:FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。
如CGI,FastCGI也具有语言无关性。
- 功能:FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
fork-and-execute 模式:CGI方式在遇到连接请求(用户请求)先要创建cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。
- 工作方式:首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。
简单点理解:FastCGI是将多个CGI解释器进程(多个php-cgi)长时间保持在内存中的进程管理器。因为CGI的启动很慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。
PHP-CGI
PHP-CGI就是PHP实现的自带的FastCGI管理器。
但是这东西又缺点:
1.php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启。
2.直接杀死php-cgi进程,php就不能运行了。
PHP-FPM
php-fpm的管理对象是php-cgi,但不能说php-fpm是FastCGI进程的管理器,因为前面说了FastCGI是个协议,似乎没有这么个进程存在,就算存在php-fpm也管理不了他(至少目前是)。他负责管理一个进程池,来处理来自Web服务器的请求。
对于php.ini文件的修改,php-cgi进程是没办法平滑重启的,有了php-fpm后,就把平滑重启成为了一种可能,php-fpm对此的处理机制是新的worker用新的配置,已经存在的worker处理完手上的活就可以歇着了,通过这种机制来平滑过度的。