通用网关接口(Common Gateway Interface, CGI)是一个 Web 服务器(Server)主机提供信息服务的标准接口,通过提供这样一个标准接口,Web 服务器能够执行应用程序并将它们的输出,如文字、图形、声音等传送给一个 Web 浏览器。一般来说,CGI 标准接口的功能就是在 HTML 文档与服务器应用程序之间传递信息。
CGI标准接口主要解决以下几个问题:
- Web 服务器和 CGI 程序之间如何传送信息?
- Web 服务器向 CGI 程序传送什么信息?
- Web 服务器向 CGI 程序传送信息的格式是什么?
- CGI 程序向 Web 服务器返回什么信息?
- CGI 程序向 Web 服务器返回信息的格式是什么?
如果没有 CGI,一个 Web 服务器将指南提供静态文本文件或连接到其他服务器。
个人理解
协议和接口:
- 协议和接口都是在阐述两个程序之间如何进行信息交互。
- 协议是远程规范,即不同机器间的信息交流
- 接口是同一个机器上的不同软件如何进行信息交流。
- 协议和接口主要说明两个事情:
- 如果你想要获取我给你的信息,你应该怎么做?
- 如果你想发信息给我,你可以怎么做?
- 主动发起信息交互的程序实现这个接口,而接收信息方使用这个接口。
- nginx主动调用php,所以nginx实现这个接口,php通过这个接口知道怎么获取它想要的信息,以及如何把信息正确传回去。
程序和服务:
- 进程:运行的程序。
- 守护进程:一直运行在后台的程序。
- 服务:监听端口,对外提供服务的守护进程,web服务,svn服务,mysql服务。
- Web服务:实现http和https协议的服务。
命令和语言:
- 命令:可以直接执行的二进制文件。
- 语言:其实就是把其他常用的命令封装起来,以一种统一的方式去调用其他命令,是一个比较复杂的命令。
Web 服务器:
- 监听端口,接收客户端传来的数据,并返回相应的数据回客户端。
- 静态文件也是返回的文本数据,并不是返回一个文件,而是把文件的内容返回回去。
- 文件:就是一个有边界的数据,不同的文件有不同的解析方式。
- web服务器并不是一门语言,所以无法处理太复杂的逻辑,但它可以通过cgi接口,调用可以处理数据的语言,而它只需要把处理完的数据返回给客户端即可。
通过CGI方式访问全球互联网www可以分为以下几个步骤:
- 浏览器分析 url 的第一部分,并试图连接到相应的服务器。
- 浏览器提供 url 的其余部分给服务器
- 服务器将 url 翻译成一个路径和文件名。
- 服务器将 url 指向一个应用程序而不是一个静态文件
- 服务器为应用程序执行做准备
- 应用程序执行,读取标准输入和有关环境变量
- 应用程序准备进行标准输出
- 应用程序发生标准输出并结束
- 服务器断开连接
- 浏览器显示应用程序的输出结果。
CGI 工作目录
CGI 工作目录是一个特定的目录,所有编译好的 CGI 程序都要集中放在这个 CGI 工作目录中。对于 UNIX 系统而言,最常见的 CGI 工作目录是 CGI-BIN;Windows系统是 CGI-WIN 。当服务器看到被请求的程序位于 CGI 目录时,就知道它是一个 CGI 程序,从而去执行该程序,并将执行结果返回给浏览器。
CGI 缺点
CGI 应用程序一般都是一个独立的可执行程序,和web服务器各自占据不同的进程,二一般一个 CGI 应用程序只能处理一个用户请求。这样,每有一个用户请求,都会激活一个 CGI 进程,当用户请求数量非常多时,将会大量挤占系统的资源,造成效能低下。
CGI 程序语言
任何一个程序语言所设计的应用程序,如果可以在服务器上执行,并利用服务器与 CGI 程序的标准接口来传送有关信息,则这种程序语言旧可以称之为“CGI程序语言”。
CGI 环境变量
web服务器除了将用户发送的信息传递给 CGI 程序之外,还通过设置环境变量的方式,提供一些相关的状态信息和环境信息。
- REQUEST_METHOD:指出服务器和 CGI 程序之间的信息传输方式,POST | GET。
- CONTENT-TYPE:指示传送的信息的 MIME 类型,表单:application/x-www-form-urlencoded 。
- CONTENT_LENGTH:如果服务器与 CGI 程序信息的传送方式是 POST,这个环境变量就是从标准输入 STDIN 中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须用到。
- QUERY_STRING:如果服务器与 CGI 程序信息的传送方式是 GET,这个环境变量的值就是所传送的信息。
- REMOTE_ADDR:发送请求的客户机的 IP 地址,这个值总是存在的。
- REMOTE_HOST:客户机主机名
- SERVER_NAME:服务器的主机名或其 IP 地址。
- SERVER_HOST:服务器接收请求时所使用的端口号,Web 服务器使用这个端口来监听到达的 CGI 请。
- SERVER_PROTOCOL:发送请求的协议名称和版本号,HTTP/1.0
- SCRIPT_NAME:调用 CGI 程序时所使用的文件名。/cgi-bin/hello.exe
- HTTP_USER_AGENT:客户机上浏览器的有关信息
- PATH_INFO:路径信息
CGI 格式化输出
两条必须遵循的准则:
- 必须输出到标准输出 STDOUT
- 任意输出前面必须有一个用于定义 MIME 类型的输出内容(Content-type)行,而且随后还必须跟一个空行。
CGI 标题
标题 | 描述 |
---|---|
Content-type | 设定随后输出数据所用的 MIME 类型。只要 CGI 程序需要输出非 CGI 标题的信息,则内容类型必须为第一行 |
Location | 指出输出为另一个文档而不是当前文档,其值为文档的标识地址(URL) |
Status | 指定HTTP状态码,服务器将把这个状态码与响应信息一起返回给客户机 |
这个三个标准 CGI 标题必须独占一行,后面再接一个空行。这样,服务器才能正确解释这个输出,并根据该输出生成一个正确的 HTTP 响应。