查阅了资料后, 有一个笼统的理解, 请指正:
在一个计算机上运行着一个网站, 有如下分工.
1. Nginx 监听计算机的某一个端口(比如80), 等待用户的request
2. 远程有一个用户执行了一个request, Nginx监听到了, 然后把这个请求传给CGI程序(比如Python的WSGI)
3. CGI程序接受请求, 运行对应的代码, 然后返回一个response
上面的理解对吗? 如果是对的, Nginx为什么要存在呢? 因为好像就算没有Nginx, 直接用CGI接受请求也是可以的样子, 仅仅是为了负载平衡吗?
谢谢.
蟹妖。一股知乎范儿
首先把问题修正为
为什么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
,所以,是不能互换的。最后,写的比较仓促,很多表述有不严谨的地方,欢迎拍砖。