IDEA激活码 (2021-06-19)

CGI——web server实现动态请求的传统基础协议

common gateway interface ,简称cgi,含义为通用网关协议。

最初互联网上的内容都是静态的,没有动态内容。当然也不需要php、java等web开发平台,只需要将静态的文件放到web服务器上即可。

随着互联网发展,网站有了动态需求。为了实现动态处理web请求的需求,设计了cgi的概念。cgi从名字上可以看出,他的本质是一个协议,此协议定义了web server和具体实现动态逻辑的通信规范。下面使用一个实例来说明cgi协议,cgi程序的关系以及在处理http请求过程中担当的角色和所处的位置。

以php程序为例,我们看下一个普通的网络请求是如何被处理的。首先浏览器发送一个路由为/api/xxx/xx的http请求到web server,比如当前使用的web server为nginx。nginx的配置文件中事先会配置好/api/下的任何路由都将使用名为xxCGI的程序来处理。当nginx接受到此请求时,会实例化此xxCGI程序的一个进程(这个xCGI程序是按照cgi协议实现的一个cli程序(控制台程序)),并且将http请求中的参数放到此进程的环境变量中。那么此xCGI进程即可从环境变量中获取http请求参数,并且调用php解释器来实现具体的业务逻辑。并且将处理结果通过cli程序的标准输入输出返回给nginx。然后nginx将此响应返回给浏览器。响应之后将销毁此xCGI实例。

可以看到在上面的例子中,cgi程序要做的有两点

从上面的第一点可以看出,实现一个cgi程序是没有语言限制的。只要按照cgi协议中规定的方式来输入输出和获取http参数即可。而从第二点可以看出,不同语言要实现不同的cgi程序,比如php中实现cgi协议的应用程序为php-cgi。那么类似,要想在python的环境下使用cgi的方式来处理http请求,则需要实现一个特定的cgi程序来调用python的语言解释器。其他语言一样。

从另一个角度理解cgi的概念:cgi程序是web server和不同语言解释器之间的一套协议。通过cgi,可以实现使用不同的语言来处理动态的业务逻辑。

cgi要解决的核心问题是如何实现动态处理请求,针对此cgi协议完美解决了此核心矛盾。 cgi的局限性是每个请求都会启动一个cgi应用的进程,等到此请求处理完毕之后会销毁此进程。 这样就带来了大量的实例化和销毁的工作量。性能及其不好。为了解决此问题,又提出了cgi协议的替代者。fast-cgi或者叫fcgi,Fast Common Gateway Interface(快速通用网关接口)。

 

此协议解决的主要问题是cgi性能太差的问题。我们下篇文章继续了解fast cgi。