有了CGI为什么还需要Nginx?


查阅了资料后, 有一个笼统的理解, 请指正:

在一个计算机上运行着一个网站, 有如下分工.


 1. Nginx 监听计算机的某一个端口(比如80), 等待用户的request

2. 远程有一个用户执行了一个request, Nginx监听到了, 然后把这个请求传给CGI程序(比如Python的WSGI)

3. CGI程序接受请求, 运行对于的代码(脚本), 然后返回一个response

4. reponse再通过Nginx返回给用户

上面的理解对吗? 如果是对的, Nginx为什么要存在呢? 因为好像就算没有Nginx, 直接用CGI接受请求也是可以的样子, 仅仅是为了负载平衡吗?

谢谢.

web nginx cgi

Yunaki7 10 years, 7 months ago

蟹妖。 一股知乎范儿
首先把问题修正为 为什么CGI与WebServer不能互相替代? 因为 CGI 是一种标准, Nginx 则是一种应用。两者不是同类,所以下面用 WebServer 代替 Nginx

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

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

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

最后,写的比较仓促,很多表述有不严谨的地方,欢迎拍砖。

仙女屁屁弹 answered 10 years, 7 months ago

Your Answer