web - 有了CGI為什么還需要Nginx?
問題描述
查閱了資料后, 有一個籠統的理解, 請指正:
在一個計算機上運行著一個網站, 有如下分工.
1. Nginx 監聽計算機的某一個端口(比如80), 等待用戶的request2. 遠程有一個用戶執行了一個request, Nginx監聽到了, 然后把這個請求傳給CGI程序(比如Python的WSGI)3. CGI程序接受請求, 運行對應的代碼, 然后返回一個response
上面的理解對嗎? 如果是對的, Nginx為什么要存在呢? 因為好像就算沒有Nginx, 直接用CGI接受請求也是可以的樣子, 僅僅是為了負載平衡嗎?
謝謝.
問題解答
回答1:蟹妖。一股知乎范兒首先把問題修正為為什么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,所以,是不能互換的。
最后,寫的比較倉促,很多表述有不嚴謹的地方,歡迎拍磚。
回答2:負載均衡反向代理平滑升級擴容災備隱藏CGI語言種類記錄日志gzip太多了,我覺得仔細想想以后我還能列出至少和上面一樣長的nginx的其他好處
回答3:瀏覽器跟 Web 服務器間的通信是 HTTP 協議。瀏覽器不支持 CGI/FastCGI 協議,所以無法拋棄 Nginx 直接跟 FPM 、PHP-CGI 等通信。
回答4:Nginx本質是個web server,如果直接用CGI,那么這個CGI就成了web server,邏輯又混亂了。CGI是為了處理動態的邏輯。web server僅僅是一個HTTP服務的實現,只管收一個請求,然后回復一個相應的響應(通常是一個HTML頁面,根據請求的不同,也可以是其它的文件),不管任何邏輯。所有的邏輯處理,都是扔給CGI的。比如用戶登錄的驗證等。
回答5:可以把Nginx想像為傳令兵,主要的活不是他做的,但是如果沒有他,實際干活的人就是親自跑去接任務、交任務。
不是不能做,而是干活的人只愿意關心工作如何做好,不愿意做跑腿那堆事兒,把自己的功能弄成大雜燴。
回答6:你不覺得如果沒有Nginx,你列出的4點中的第1點就沒人干了嗎?
回答7:靜態文件,基本都交給nginx去處理了。動態的請求的話,nginx相當于一層路由了,想轉到哪兒就轉到哪兒,cgi只需要專注處理具體的業務邏輯即可
相關文章:
1. mysql - 新浪微博中的關注功能是如何設計表結構的?2. MySQL數據庫中文亂碼的原因3. angular.js使用$resource服務把數據存入mongodb的問題。4. dockerfile - [docker build image失敗- npm install]5. 如何解決Centos下Docker服務啟動無響應,且輸入docker命令無響應?6. angular.js - 關于$apply()7. nignx - docker內nginx 80端口被占用8. 我在centos容器里安裝docker,也就是在容器里安裝容器,報錯了?9. android-studio - Android Studio 運行項目的時候一堆警告,跑步起來?。?/a>10. angular.js - Ionic 集成crosswalk后生成的apk在android4.4.2上安裝失敗???
