為什麼 Node.js 做的站點可以不用 nginx / Apache 這類 Web server 軟體?
01-05
我想大概是負載處理的關係。
不要說反向代理。nginx還可以反向代理到Apache呢,我自己都這麼干。不要說靜態文件處理。我知道這方面nginx很強。
通常來說,需要使用nginx作為反向代理無非兩個原因
- 並發性不足,如Apache
- 不具備標準HTTP1.1的全部功能,如Python的一個Http框架tornadoweb
nodejs的http庫實現了完整HTTP1.1的全部功能(事實上,這部分的源代碼正是copy自nginx),而且nodejs的並發性完全滿足要求。在這樣的情況下,仍然使用反向代理反而降低了效率。
自帶了web server功能
Nginx 和 Apache無非是幫你做了網路層和HTTP協議層的解析和處理而已。現在幾乎任何的語言你都可以脫離Apache/Nginx,無非自己寫socket監聽,處理HTTP的協議頭和協議體,然後構建HTML。但是出於性能的考慮,沒人這麼干而已。
沒玩過Node.JS,無非就是它自己內置的http server足夠高效,但是多數還是需要nginx做負載均衡,像Python寫的Tornado,單獨性能也很好,但是有了nginx反向代理,性能要更強悍。Node.js擁有自己構建一個Server的能力,所以Node.js「可以」(或者說是有能力)不使用Nginx/Apache這類Server或反向代理伺服器。
但是這並不代表在生產環境中就不用、不應該用Nginx之類。一般來說,都會放在某個反向代理後邊。
不同的東西有各自擅長的地方,就算它有能力,也不一定要讓它干這個事,是不?我覺得問題的答案就一句話啊。
node.js自己就是WebServer。
為啥這麼多人東拉西扯的,而且我到現在也沒看明白LZ到底在問啥。
這個問題在我眼裡我直接腦補成為什麼穿了南極人就不用穿秋褲了。nginx/apache 都是用 C 寫的 伺服器, C 寫得, js 寫不得? 照樣也可以寫, 所以node.js
最早的Web處理是CGI,你可以把CGI想成即跑腳本也是容器的一體(其實是很多原生的開發語言編譯連接的執行程序,通過http請求,然後給你返回符合HTML標記法的字元串),後來CGI分成了容器和開發執行腳本,比如nginxapache omcatjboss等就是容器,容器把網路連接,路徑尋找、會話管理等很多原來CGI中共有的部分抽象出來了;然後phpservletasp等就是開發執行腳本,他們主要針對單個會話的資源請求響應。現在的Node.js如果你用來開發WEB的話,其實就是CGI,Node.js即是容器也是執行腳本,既管理會話連接路徑資源,又管理每個會話資源請求響應。既然是CGI,那麼就比容器+腳本的高級模式更加靈活。
nginx可以開多個worker進程處理http請求,從這點上說node.js就比不上nginx。
你要開多個node進程監聽同一個埠嗎?單個進程佔用一台機器也太浪費了,其他幾個cpu核心都閑著。從你的提問來看,你既不懂nginx也不懂node.js。
還是讓nginx辛苦點,在前面扛著,這樣後面的web app也輕鬆點,每次都是收到一個完整的http請求,處理完返回給nginx。我用nginx現在只有一個目的,負責轉發不同的域名....
nodejs在處理big file的上傳下載其實是有問題的,通過nginx反向代理來分擔會更好。
推薦閱讀:
※現在前端必須掌握nodejs技術嗎?
※前端構建工具 Gulp / browserify/ webpack / npm ?
※npm和bower都有的模塊怎麼選擇?
※手機遊戲伺服器端用node.js 還是用go,fibjs之類等比較好?
※Node.js 真的不適合大規模開發嗎?