1.CGI 简介

来源:互联网 发布:ai软件怎么使用 编辑:程序博客网 时间:2024/06/08 09:05

1.公共网关接口

这里写图片描述


2.编写语言

CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。对初学者来说,最好选用易于归档和能有效表示大量数据结构的语言,例如UNIX环境中:· Perl (Practical Extraction and Report Language)· Bourne Shell或者Tcl (Tool Command Language)· PHP(Hypertext Preprocessor))由于C语言有较强的平台无关性,所以也是编写CGI程序的首选。Windows环境中:· CC++由于Internet上大部分服务器使用的是UNIX操作系统,且几乎任一UNIX操作系统中都有Bourne Shell,因而大部分实现脚本都是用Bourne Shell编写的。最终Perl由于其跨操作系统、易于修改的特性成为了CGI的主流编写语言,以至于一般的“cgi程序”就是Perl程序。

3.服务器配置

CGI程序不是放在服务器上就能顺利运行,如果要想使其在服务器上顺利的运行并准确的处理用户的请求,则须对所使用的服务器进行必要的设置。配置:根据所使用的服务器类型以及它的设置把CGI程序放在某一特定的目录中或使其带有特定的扩展名。⑴CERN格式服务器的配置:编辑CERN格式服务器(起初其被命名为“CERN httpd”, 也被称为“W3C httpd”)的配置文件(通常为/etc/httpd.conf)在文件中加入:Exec cgi-bin/*/home/www/cgi-bin/*.exec。命令中出现的第一个参数cgi-bin/*指出了在URL中出现的目录名字,并表示它出现在系统主机后的第一个目录中,如:http://edgar.stern.nyn.***/cgi-bin/。命令中的第二个参数表示CGI程序目录放在系统中的真实路径。CGI目录除了可以跟网络文件放在同一目录中,也可以放在系统的其它目录中,但必须保证在你的系统中也具有同样的目录。在对服务器完成设置后,须重新启动服务器(除非HTTP服务器是用inetd启动的)。⑵NCSA格式服务器的配置在NCSA格式服务器上有两种方法进行设置:①在srm.conf文件(通常在conf目录下)中加入:Script Alias/cgi-bin/cgi-bin/。Script Alias命令指出某一目录下的文件是可执行程序,且这个命令是用来执行这些程序的;此命令的两个参数与CERN格式服务器中的Exec命令的参数的含意一样。②在srm.conf文件加入:Add type application/x-httpd-cgi.cgi。此命令表示在服务器上增加了一种新的文件类型,其后第一个参数为CGI程序的MIME类型,第二个参数是文件的扩展名,表示以这一扩展名为扩展名的文件是CGI程序。在用上述方法之一设置服务器后,都得重新启动服务器(除非HTTP服务器是用inetd启动的)。

4.环境变量列表

SERVER_NAME:运行CGI序为机器名或IP地址。SERVER_INTERFACE:WWW服务器的类型,如:CERN型或NCSA型。SERVER_PROTOCOL:通信协议,应当是HTTP/1.0。SERVER_PORT:TCP端口,一般说来web端口是80。HTTP_ACCEPT:HTTP定义的浏览器能够接受的数据类型。HTTP_REFERER:发送表单的文件URL。(并非所有的浏览器都传送这一变量)HTTP_USER-AGENT:发送表单的浏览的有关信息。GETWAY_INTERFACE:CGI程序的版本,在UNIX下为 CGI/1.1。PATH_TRANSLATED:PATH_INFO中包含的实际路径名。PATH_INFO:浏览器用GET方式发送数据时的附加路径。SCRIPT_NAME:CGI程序的路径名。QUERY_STRING:表单输入的数据,URL中问号后的内容。REMOTE_HOST:发送程序的主机名,不能确定该值。REMOTE_ADDR:发送程序的机器的IP地址。REMOTE_USER:发送程序的人名。CONTENT_TYPE:POST发送,一般为application/xwww-form-urlencoded。CONTENT_LENGTH:POST方法输入的数据的字节数。

5.工作原理

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

WSGI, Web Server Gateway Interface如全称代表的那样,WSGI不是服务器,不是API,不是Python模块,更不是什么框架,而是一种服务器和客户端交互的接口规范!更具体的规范说明请搜索“PEP 3333”。在WSGI规范下,web组件被分成三类:client, server, and middleware.WSGI apps(服从该规范的应用)能够被连接起来(be stacked)处理一个request,这也就引发了中间件这个概念,中间件同时实现c端和s端的接口,c看它是上游s,s看它是下游的c。WSGI的s端所做的工作仅仅是接收请求,传给application(做处理),然后将结果response给middleware或client.除此以外的工作都交给中间件或者application来做。

CGI是比较原始的开发动态网站的方式。你可以想象一下,一个网站的动态内容肯定是程序生成的,光是静态的html页面无法达到这个效果。那么,这个程序就需要接受客户端的请求,然后进行相应处理,再返回给客户端,客户端和服务端的通信当然是通过HTTP协议。然后我们会发现,这个程序在处理客户端请求的时候,大部分时候会进行很多重复的工作,比如说HTTP请求的解析。也就是说,你的程序需要解析HTTP请求,我的程序也需要解析。于是为了DRY原则,Web服务器诞生了。(以下所说的都是CGI的工作模式)于是Web服务器可以解析这个HTTP请求,然后把这个请求的各种参数写进进程的环境变量,比如REQUEST_METHOD,PATH_INFO之类的。之后呢,服务器会调用相应的程序来处理这个请求,这个程序也就是我们所要写的CGI程序了。它会负责生成动态内容,然后返回给服务器,再由服务器转交给客户端。服务器和CGI程序之间通信,一般是通过进程的环境变量和管道。这样做虽然很清晰,但缺点就是每次有请求,服务器都会fork and exec,每次都会有一个新的进程产生,开销还是比较大的。原因在与CGI程序是一个独立的程序,它是可以独立运行的(在提供HTTP请求的情况下),它可以用几乎所有语言来写,包括perl,c,lua,python等等。所以对于一个程序,服务器只能以fork and exec的方式来调用它了。
CGI,一言以蔽之——协议。为了和普通的网络协议做区分,我们可以称之为接口协议。所谓协议就是各方约定,达成共识的一种规则。比如中国公路靠右行驶,这就是公路的协议。网络协议约定的是逐字节的含义,大家遵守,就能方便解析,理解。CGI约定的不是逐字节的语义,而是一个个kv(不完全是kv,但可以大概这么理解)。用一个不太恰当的比喻来形容,网络协议描述的单位是数组,而CGI接口协议描述的是map(或者说字典,或者说关联数组)。CGI是古老的web技术,在php这类动态网页语言出现之前承担过一个时期的历史任务。当时多是用perl或c来编写CGI程序。前端通过表单或其他东西可以向服务器(比如Apache)发送一个URL,以及额外的参数(get或post等请求类型及其参数,服务器的信息等等),还有cookie等信息。那么Apache在开启 了cgi模块以后可以将其发送给一个CGI程序,这个程序可以是各种语言,比如c++(或c语言)就是从环境变量中解析出这样请求的具体参数。然后向标准输出输出内容(比如cout了一段HTML代码),这些内容没有被打印到控制台上,而是最终响应给了你的浏览器,渲染出了网页。重要一点是CGI程序记得要自己先输出http报头哦。缺点是每一次向CGI发送请求,都会生成一个CGI进程,,这种就是所谓的fork-and-exec模式,也通常是导致并发瓶颈的症结。反向代理加上大型的的分布式系统可以一定程度上减轻这些压力。大浪淘沙,如今CGI几乎已经消失在了人们的视野中,然而它确实让你了解很多web底层知识的好工具。近年来由于fcgi的出现,一直以来被人们所诟病的fork-and-exec问题得到解决,使得CGI多少又浮出了一点水面。顺带一提,,腾讯几乎是是国内硕果仅存的使用c++和CGI做web后端(大部分业务,不过应该不是全部业务采用cgi)的公司了,这主要是由于历史原因吧。 大学生朋友们,如果应聘腾讯看到后台工程师的技能要求是c++,千万不要惊讶。。看到php是前端工程师的要求也别奇怪,毕竟c++直接cout出来HTML还是略蛋疼,php做这层view应该是一种高效的解决方案吧。当然不加php,前端直接对接后台c++也是不奇怪的,毕竟restful的风格走俏嘛!
cgi是通用网关接口,是连接web服务器和应用程序的接口。web服务器负责接收http请求,但是http请求从request到response的过程需要有应用程序的逻辑处理,web服务器一般是使用C写的,比如nginx,apache。而应用程序则是由各种语言编写,比如php,java,python等。这两种语言要进行交互就需要有个协议进行规定,而cgi就是这么个网关协议。拿nginx+fastcgi+php为例子,nginx里面的fastcgi模块实现cgi的客户端,php的cgi-sapi实现cgi的服务端。WSGI就是Python的CGI包装,相对于Fastcgi是PHP的CGI包装

http://baike.baidu.com/subview/32614/12037322.htm

https://www.zhihu.com/question/19998865

https://www.python.org/dev/peps/pep-0333/

https://www.zhihu.com/question/19582041

https://www.zhihu.com/question/30672017

https://www.zhihu.com/question/28494970

https://www.zhihu.com/question/21432096

https://zhuanlan.zhihu.com/p/20054757

http://blog.csdn.net/five3/article/details/7732832

https://www.douban.com/note/13508388/

http://www.biaodianfu.com/cgi-fastcgi-wsgi.html

0 0