cgi_and_fastcgi
CGI
来自维基百科
In computing, Common Gateway Interface (CGI) offers a standard protocol for web servers to execute programs that execute like Console applications (also called Command-line interface programs) running on a server that generates web pages dynamically. Such programs are known as CGI scripts or simply as CGIs. The specifics of how the script is executed by the server are determined by the server.[1] A CGI script essentially reads a query string and produces a HTML page.[2]
CGI接口定义了server如何执行脚本并返回一个HTML页面.
实际上, 在网络发展早期, 浏览器向服务器发送HTTP请求, 首先会到达Http Web Software, 如IIS, Apache, Nginx, Node-js服务器等. 然后这些服务器捕获了这些HTTP请求, 会解析出请求的内容, 并将具体的请求内容调用一些脚本或者程序, 执行完之后会组成html的输出, 返回给client端. CGI就是HTTP请求通过服务器软件传给脚本的接口定义.
This is usually done by marking a directory within the document collection as containing CGI scripts - its name is often cgi-bin. For example, /usr/local/apache/htdocs/cgi-bin could be designated as a CGI directory on the web server. When a Web browser requests a URL that points to a file within the CGI directory (e.g., http://example.com/cgi-bin/printenv.pl/with/additional/path?and=a&query=string), then, instead of simply sending that file (/usr/local/apache/htdocs/cgi-bin/printenv.pl) to the Web browser, the HTTP server runs the specified script and passes the output of the script to the Web browser. That is, anything that the script sends to standard output is passed to the Web client instead of being shown on-screen in a terminal window.
由web server执行脚本, 但这里的脚本或者软件, 都应该是命令行的, 在web server中会有一个目录(虚拟, 总之是一个Dict结构, 映射了url和script的对应关系), 如果收到client的对文件的请求, web server就会把本来返回脚本文件的行为变为执行脚本, 然后返回脚本输出到标准输出的内容, 并返回给client.
As remarked above, the CGI standard defines how additional information passed with the request is passed to the script. For instance, if a slash and additional directory name(s) are appended to the URL immediately after the name of the script (in this example, /with/additional/path), then that path is stored in the PATH_INFO environment variable before the script is called. If parameters are sent to the script via an HTTP GET request (a question mark appended to the URL, followed by param=value pairs; in the example, ?and=a&query=string), then those parameters are stored in the QUERY_STRING environment variable before the script is called. If parameters are sent to the script via an HTTP POST request, they are passed to the script's standard input. The script can then read these environment variables or data from standard input and adapt to the Web browser's request.[10]
这里还涉及到对于HTTP请求方式的不同, 上面的例子上是当请求server software的脚本文件时,
请求是
http://example.com/cgi-bin/printenv.pl/with/additional/path?and=a&query=string
如果是HTTP GET请求, 在请求脚本文件后还加了/with/additional/path
, 这个会被保存在一个环境变量中PATH_INFO
中, 而后面的请求参数也会被保存在一个环境变量QUERY_STRING
中.
如果是HTTP POST请求, 在HTTP请求体里面的参数会被重定向到脚本的标准输入, 然后执行脚本.
FastCGI
FastCGI是CGI的一个变种, 是一个二进制协议, 目的在于减少server software和CGI pragrams的过度交互, 并使server可以一次处理多个请求. CGI Application是one request, one process, 效率比较低.
FastCGI可以认为是web server和application的中间层, FastCGI有一个一直存在的service process, 通过socket, pipe或者是TCP和web server的进程通信, 会不断把请求参数传递给application.
Python WSGI
WSGI(Web Server GateWay Interface)
在CGI和FastCGI之上, Python实现了WSGI, 作为对于使用Python开发web application时同web server的接口. WSGI中有middleware的概念, 类似于FastCGI, 也是中间层.
cgi_and_fastcgi的更多相关文章
随机推荐
- [OpenGL]配置GLFW(超详细)
注:本文可转载,转载请著名出处:http://www.cnblogs.com/collectionne/p/6937644.html.本文还会修改,如果不在博客园(cnblogs)发现本文,建议访问上 ...
- 454. 4Sum II
Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such t ...
- Lightoj1011【KM算法】
题意: 问男孩女孩最大的可能值?其实就是一个二分图的最大权值匹配问题:模板题吧.. #include<cstdio> #include<math.h> #include< ...
- [Xcode 实际操作]九、实用进阶-(10)定位设备的使用
目录:[Swift]Xcode实际操作 本文将演示定位设备的使用. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //导入需要用到的定位 ...
- hyperledger fabric 1.0.5 分布式部署 (七)
fabric 使用 fabric-ca 服务 准备部分 首先需要用户从github上download fabric-ca 的工程代码 cd $GOPATH/src/github.com/hyperle ...
- RPC入门
在校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司尤其是大型互联网公司就会发现,公司的系 ...
- (转)关于MongoDB你需要知道的几件事
本文列举了颇让作者困惑的一些MongoDB限制,如果你也打算使用MongoDB,那么至少要提前了解这些限制,以免遇到的时候措手不及. 消耗磁盘空间 这是我的第一个困惑:MongoDB会消耗太多的磁盘空 ...
- 分布式通信-tcp/ip 单播
服务端 public class SingleBroadCastSocketServer { public static void main(String[] args) { ServerSocket ...
- ZROI #365. 【2018普转提day18专题】嘤嘤嘤嘤
ZROI #365. [2018普转提day18专题]嘤嘤嘤嘤 直接放代码 具体做法见注释 #include<stdio.h> #include<cstring> #inclu ...
- RTT
Segger RTT的使用 一般arm系统中,如何通过电脑键盘和显示器同mcu进行交互最有效的有两种形式:arm7的semihost,cm时代的traceswo.现在jlink推出了颇具特色的rtt( ...