查閱了資料後, 有一個籠統的理解, 請指正:
在一個電腦上運行著一個網站, 有如下分工.
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
,所以,是不能互換的。最後,寫的比較倉促,很多表達有不嚴謹的地方,歡迎拍磚。
太多了,我覺得仔細想想以後我還能列出至少和上面一樣長的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只需要專注處理具體的業務邏輯即可