关于CGI

来源:互联网 发布:如何用微信推广淘宝 编辑:程序博客网 时间:2024/05/21 17:25

1.  CGI(Common Gateway Interface)可以说是一种替代用户直接访问服务器上文件而诞生的一种“代理”,用户通过CGI来获取动态数据或文件等。

从最原始的意义上来说,CGI是一种设计思想,其最早的实现是每次请求都直接调用操作系统来创建进程、销毁进程,这种程序虽然效率不高但是给WEB数据动态访问提供了很好的思路。

现在经过改进的CGI效率已经大大提高,尤其是fastCGI等实现。

而WSGI是Web Server Gateway Interface的简称,从名字上看和CGI一定有渊源。事实上,由于之前的CGI程序和编写WEB服务所用的语言往往是不同的(CGI用C,WEB用PHP等),WSGI的其中一个目的就是让用户可以用统一的语言编写前后端,WSGI参考了CGI的设计,对CGI的设计思想进行了进一步包装。


2. fastcgi: apache/lighttpd的一个模块,虽然flup可以作为一个独立的web server使用,但是对于浏览器请求处理一般都交给 apache/lighttpd处理,然后由apache/lighttpd转发给flup处理,这样就需要一个东西来把apache/lighttpd跟flup联系起来,这个东西就是fastcgi,它通过环境变量以及socket将客户端请求的信息传送给flup并接收flup返回的结果

3. 腾讯的后台,大部分是用C++开发的,也有一部分用php,java,python等。各部门之间差别很大。

用cgi写网页,是一种比较落后低效的方案。但是由于腾讯内部C++独一无二的地位,所以不仅逻辑层用C++写,连大部分网页都用C++写(通常是在cgi-bin目录下面放一些可执行文件,http请求转发到对应的可执行文件去生成页面)。
但是我们要知道,url路径与后台实现其实没有什么必然联系。我们很多网站,明明不是用cgi写的,却故意要在url中加个cgi-bin;明明不是jsp,却在url中加个.jsp;明明不是nginx,500的时候却故意输出个nginx错误信息;主要是为了误导一下黑客们。

4. cgi-bin 这很有可能说明后台是C/C++写的. 动态Web技术刚出来的时候, 服务器调用本地应用程序处理http请求的技术. 通常是C/C++程序. 后来有了新的web开发技术后这类用的就比较少了.
url后缀有个经验. php asp结尾的顾名思义可以知道是什么语言写的
.do .action .jsp 通常是java技术写的.

5.Nginx本质是个web server,web server仅仅是一个HTTP服务的实现,只管收一个请求,然后回复一个相应的响应(通常是一个HTML页面,根据请求的不同,也可以是其它的文件),不管任何逻辑。所有的逻辑处理,都是扔给CGI的。比如用户登录的验证等。
浏览器的角度来看,浏览器只负责发送请求,接收来自WebServer的返回结果并渲染之。对于WebServer来讲,它需要做的仅仅是接收请求,寻找浏览器请求的文件并且发送回去。如果仅仅是这样,世界就很完美了。

但是后来发生的事情大家都知道了。。我们不光要浏览静态网页,我们还要登陆论坛、发帖骂人灌水踩答案点赞刷声望等等。这些行为是静态的Html没法完成的。所以有了JS、Flash等等基于前端的交互技术。WebServer把包含了这些代码的文件发给浏览器,后者把它解析称它应该有的样子(或者不应该有的样子,比如IE6),我们可以在页面上看看动画什么的,这些称之为前段交互技术。
但是有些交互前端做不了, 比如我上次发了一个高清无码套图,我要看到大家的反应,点个赞啊楼主好人啊之类的,那么这个技术就要用到数据库,但是数据库本身是需要另外一种语言来操作的,这种语言可以是python、prel、Ruby、PHP等等,我们称之为动态语言。他们对数据库进行增删查改四大操作,并且返回结果给WebServer,后者再传给浏览器。

由于有很多动态语言和很多种Web服务器,他们彼此之间互不兼容,给程序员造成了很大的麻烦。那么,CGI应运而僧。CGI的定义是统一网关接口。从此WebServer收到后台动态交互请求就直接发给CGI,CGI发给动态语言,动态语言把结果发回给CGICGI再发回给WebServer,后面的事情你都清楚了。。。。

那么结论就是,CGI是一个翻译层,它的功能不是直接提供结果给浏览器,而是翻译来自WebServer的请求并转给后台的应用程序,并且把执行结果翻译成静态网页返回给WebServer,所以,是不能互换的。

6. 比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。好了,如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。Nginx会传哪些数据给PHP解析器呢?url要有吧,查询字符串也得有吧,POST数据也要有,HTTP header不能少吧,好的,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议.当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。

0 0