CGI简介
在计算机行业,CGI是Common Gateway Interface 的缩写,它为Web服务器提供了一套标准的协议(参看RFC3875),以便Web服务器能够像执行终端应用程序(也成为命令行程序)一样来执行程序,这些运行在Web服务器上的程序,通常用于动态的生成Web页面。这些程序通常被成为CGI脚本或者直接简称为CGI。
举例来说,来自客户端的HTTP POST请求会将通过标准输入将HTML表单等数据发送到CGI程序, 其他数据(例如URL路径和HTTP标头数据)会作为进程的环境变量。
实际上,在 RFC3875 (The Common Gateway Interface (CGI) Version 1.1)中,主要就是规定了HTTP请求中的数据、环境变量应该如何传递给CGI,以及CGI程序应该如何进行响应等内容。也就是说,CGI协议和HTTP协议一样,是一个应用层协议,它主要为了解决Web服务器和其他程序间的通信问题。
来看看RFC3875中定义的一些元变量(Meta-Variables),也许有不少是大家所熟悉的:
CONTENT_TYPE
QUERY_STRING
REMOTE_ADDR
PATH_INFO
SCRIPT_NAME
// and more …
CGI 的运行原理
- 客户端访问某个 URL 地址之后,通过 GET/POST等方式提交数据,向 Web 服务器发出请求。
- 服务器端的 HTTPD守护进程会启动一个新的子进程。然后在子进程中,将 HTTP 请求里的信息通过标准输入 (STDIN) 和环境变量(ENV)传递给 URL 中指定的 CGI 程序,CGI程序执行后,执行结果会通过标准输出(STDIN)返回给 HTTPD子进程。
- HTTPD把执行结果返回给客户端。
看下面的图片更加直观的了解整个流程:

CGI 的缺点
每次处理请求时,都需要执行 fork CGI 子进程、销毁 CGI 子进程等过程。这些操作在流量不大的互联网远古时代业务还好,但是在现在这种大流量、高并发的环境下,会造成服务器资源的极大浪费。
说到这里,FastCGI(也经常写为FCGI)也就应运而生了。顾名思义,FastCGI明显是与CGI有渊源的,而且它最大的特点就是Fast,是的,相对于CGI,它的确很快,后面我会详细介绍FastCGI。