Common Gateway Interface(CGI)

Common Gateway Interface(CGI)

简介:通用网关接口

在计算机中,Common Gateway Interface提供一个标准协议给服务器去执行程序像控制台程序一样执行,使得给够动态产生网页。这样的程序被称之为CGI脚本和CGIs。服务器如何执行脚本的细节由服务器决定。在通常情况下,CGI脚本在发出请求并生成HTML时执行。

简单来说,一个Http的post请求从客户端来的,会发生一个CGI程序HTML从数据通过标准输入,其他数据,就像URL路径,和Http头数据,会以程序环境变量的形式呈现。

目的

每个web 服务器使用了一个Http服务器软件,它回应了来自于web浏览器的请求。大体上,一个服务器有一个目录,它被指定位一个文件集合——文件可以被送到浏览器通过连接到这个服务器上。举个例子,如果web服务器又个域名example.com ,然后它的文档集合被存储在/usr/local/apache/htdocs的本地文件系统中,那么服务器会回应请求,通过给对面浏览器发送文件。

对于动态构建的页面,服务器软件可能将请求到单独的程序,并将结果传递给请求客户机(通常是向最终用户显示页面的web浏览器)。在web的早期,这样的程序通常很小,用脚本语言编写;因此,它们被称为脚本。

此类程序通常需要在请求中指定一些附加信息。例如,如果Wikipedia是作为脚本实现的,那么脚本需要知道的一件事是用户是否已登录,如果已登录,则以哪个名称登录。维基百科页面顶部的内容依赖于这些信息。

HTTP为浏览器提供了将这些信息传递到web服务器的方法,例如作为URL的一部分。然后,服务器软件必须以某种方式将这些信息传递给脚本。

相反,在返回时,脚本必须提供HTTP响应请求所需的所有信息:请求的HTTP状态、文档内容(如果可用)、文档类型(例如HTML、PDF或纯文本)等等。

一开始,大家使用不同的方法,后来为了使方法可以重用,使用了一个标准的协议:即是CGI。

最初,不同的服务器软件将使用不同的方法与脚本交换这些信息。因此,即使所交换的信息是相同的,也不可能编写不经过修改就能适用于不同服务器软件的脚本。因此,决定建立交换此信息的标准方法:CGI(公共网关接口,因为它定义了服务器软件与脚本进行接口的公共方法)。根据CGI标准运行的服务器软件调用的网页生成程序称为CGI脚本。

这个标准很快被采用,并且仍然被所有著名的服务器软件所支持,例如Apache、IIS和(带有扩展名)节点。js-based服务器。

CGI脚本的早期用途是处理表单。在HTML的开始,HTML表单通常有一个“action”属性和一个指定为“submit”按钮的按钮。当按下submit按钮时,“action”属性中指定的URI将被发送到服务器,表单中的数据将作为查询字符串发送。如果“action”指定一个CGI脚本,那么CGI脚本将被执行,然后生成一个HTML页面。

CGI采用请求链接方式
CGI方式在遇到连接请求(用户请求)先要创建cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。当用户请求数量非常多时,会大量挤占系统的资源如内存,CPU时间等,造成效能低下。

CGI脚本工作流程:

  1. 浏览器通过HTML表单或超链接请求指向一个CGI应用程序的URL。
  2. 服务器收发到请求。
  3. 服务器执行所指定的CGI应用程序。
  4. CGI应用程序执行所需要的操作,通常是基于浏览者输入的内容。
  5. CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页)。
  6. 网络服务器把结果返回到浏览器中。

FastCGI

FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。
FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。CGI 就是所谓的短生存期应用程序,FastCGI 就是所谓的长生存期应用程序。

FastCGI的工作流程:

  1. Web Server启动时载入FastCGI进程管理器(PHP-CGI或者PHP-FPM或者spawn-cgi)
  2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
  3. 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
  4. FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出。

FastCGI 的特点

  1. 打破传统页面处理技术。传统的页面处理技术,程序必须与 Web 服务器或 Application 服务器处于同一台服务器中。这种历史已经早N年被FastCGI技术所打破,FastCGI技术的应用程序可以被安装在服务器群中的任何一台服务器,而通过 TCP/IP 协议与 Web 服务器通讯,这样做既适合开发大型分布式 Web 群,也适合高效数据库控制。
  2. 明确的请求模式。CGI 技术没有一个明确的角色,在 FastCGI 程序中,程序被赋予明确的角色(响应器角色、认证器角色、过滤器角色)。

ISAPI(微软的)
ISAPI(Internet Server Application Program Interface)是微软提供的一套面向WEB服务的API接口,它能实现CGI提供的全部功能,并在此基础上进行了扩展,如提供了过滤器应用程序接口。

PHP-CGI
PHP-CGI是PHP自带的FastCGI管理器。PHP-CGI的不足:

  1. php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启
  2. 直接杀死php-cgi进程php就不能运行了。(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑从新生成新的子进程。)

Spawn-FCGI
Spawn-FCGI是一个通用的FastCGI管理服务器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI进行FastCGI模式下的管理工作,不过有不少缺点。

PHP-FPM
PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的

WSGI
Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值