web - 有了CGI為什麼還需要Nginx?
漂亮男人
漂亮男人 2017-05-16 17:27:17
0
7
697

查閱了資料後, 有一個籠統的理解, 請指正:

在一個電腦上運行著一個網站, 有如下分工.

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

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

3. CGI程序接受请求, 运行对应的代码, 然后返回一个response

上面的理解對嗎? 如果是對的, Nginx為什麼要存在呢? 因為好像就算沒有Nginx, 直接用CGI接受請求也是可以的樣子, 僅僅是為了負載平衡嗎?

謝謝.

漂亮男人
漂亮男人

全部回覆(7)
左手右手慢动作

蟹妖。 一股知乎範兒
首先把問題修正為为什么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发给动态语言,动态语言把结果发回给CGICGI再发回给WebServer,後面的事你都清楚了。 。 。 。

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

最後,寫的比較倉促,很多表達有不嚴謹的地方,歡迎拍磚。

習慣沉默
  • 負載平衡
  • 反向代理
  • 平滑升級
  • 擴容災備
  • 隱藏CGI語言種類
  • 記錄日誌
  • gzip

太多了,我覺得仔細想想以後我還能列出至少和上面一樣長的nginx的其他好處

淡淡烟草味

瀏覽器跟 Web 伺服器間的通訊是 HTTP 協定。瀏覽器不支援 CGI/FastCGI 協議,所以無法拋棄 Nginx 直接跟 FPM 、PHP-CGI 等通訊。

巴扎黑

Nginx本質是個web server,如果直接用CGI,那麼這個CGI就成了web server,邏輯又混亂了。
CGI是為了處理動態的邏輯。
web server只是一個HTTP服務的實現,只管收一個請求,然後回覆一個對應的回應(通常是一個HTML頁面,根據請求的不同,也可以是其它的檔案),不管任何邏輯。所有的邏輯處理,都是丟給CGI的。例如用戶登入的驗證等。

我想大声告诉你

可以把Nginx想像為傳令兵,主要的活不是他做的,但如果沒有他,
實際工作的人就是親自跑去接任務、交任務。

不是不能做,而是工作的人只願意關心工作如何做好,
不願意當跑腿那堆事兒,把自己的功能弄成大雜燴。

曾经蜡笔没有小新

你不覺得如果沒有Nginx,你列出的4點中的第1點就沒人乾了嗎?

漂亮男人

靜態文件,基本上都交給nginx去處理了。
動態的請求的話,nginx相當於一層路由了,想轉到哪裡就轉到哪兒,cgi只需要專注處理具體的業務邏輯即可

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板