CGI 简介
CGI全称是“通用网关接口”(Common Gateway Interface),它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据。 CGI描述了客户端和这个程序之间传输数据的一种标准。 CGI的一个目的是要独立于任何语言的,所以CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。 如php,perl,tcl等。
CGI 的运行原理
客户端访问某个 URL 地址之后,通过 GET/POST/PUT 等方式提交数据,并通过 HTTP 协议向 Web 服务器发出请求。
服务器端的 HTTP Daemon(守护进程)启动一个子进程。然后在子进程中,将 HTTP 请求里描述的信息通过标准输入 stdin 和环境变量传递给 URL 指定的 CGI 程序,并启动此应用程序进行处理,处理结果通过标准输出 stdout 返回给 HTTP Daemon 子进程。
再由 HTTP Daemon 子进程通过 HTTP 协议返回给客户端。
上面的这段话理解可能还是比较抽象,下面我们就通过一次 GET 请求为例进行详细说明。
Paste_Image.png如图所示,本次请求的流程如下:
1:客户端访问 http://127.0.0.1:9003/cgi-bin/user?id=1
2:127.0.0.1 上监听 9003 端口的守护进程接受到该请求,通过解析 HTTP 头信息,得知是 GET 请求,并且请求的是 /cgi-bin/目录下的 user文件。
3:将 uri 里的 id=1通过存入 QUERY_STRING环境变量。
4:http守护进程 fork 一个子进程,然后在子进程中执行 user 程序,通过环境变量获取到id。
5:执行完毕之后,将结果通过标准输出返回到子进程。
6:子进程将结果返回给客户端。
所以cgi模式下,一个客户端进行一次web服务器请求的流程为:
客户端---->web服务器----->cgi(由web子进程创建的cgi程序)------>应用程序(比如php)
处理完这次请求后web子进程退出,cgi进程也退出。
FastCGI 简介
FastCGI是Web服务器和处理程序之间通信的一种协议, 是CGI的一种改进方案,FastCGI像是一个常驻(long-lived)型的CGI, 它可以一直执行,在请求到达时不会花费时间去fork一个进程来处理(这是CGI最为人诟病的fork-and-execute模式)。 正是因为他只是一个通信协议,它还支持分布式的运算,所以 FastCGI 程序可以在网站服务器以外的主机上执行,并且可以接受来自其它网站服务器的请求。
FastCGI 是与语言无关的、可伸缩架构的 CGI 开放扩展,将 CGI 解释器进程保持在内存中,以此获得较高的性能。 CGI 程序反复加载是 CGI 性能低下的主要原因,如果 CGI 程序保持在内存中并接受 FastCGI 进程管理器调度, 则可以提供良好的性能、伸缩性、Fail-Over 特性等。
FastCGI 工作流程如下:
1:FastCGI 进程管理器自身初始化,启动多个 CGI 解释器进程,并等待来自 Web Server 的连接。
2:Web 服务器与 FastCGI 进程管理器进行 Socket 通信,通过 FastCGI 协议发送 CGI 环境变量和标准输入数据给 CGI 解释器进程。
3:CGI 解释器进程完成处理后将标准输出和错误信息从同一连接返回 Web Server。
4:CGI 解释器进程接着等待并处理来自 Web Server 的下一个连接。
所以fast-cgi模式下,一个客户端进行一次web服务器请求的流程为:
客户端---->web服务器---->fast-cgi进程管理器--->cgi解释器--->应用程序。
FastCGI 与传统 CGI 模式的区别之一则是 Web 服务器不是直接执行 CGI 程序了,而是通过 Socket 与 FastCGI 响应器(FastCGI 进程管理器)进行交互,也正是由于 FastCGI 进程管理器是基于 Socket 通信的,所以也是分布式的,Web 服务器可以和 CGI 响应器服务器分开部署。Web 服务器需要将数据 CGI/1.1 的规范封装在遵循 FastCGI 协议包中发送给 FastCGI 响应器程序。
参考:cgi与fast-cgi
网友评论