簡體   English   中英

Node.js“服務器”與 Nginx 或 Apache 服務器相比如何?

[英]How does a Node.js “server” compare with Nginx or Apache servers?

我最近一直在研究 Node.js,並且遇到了一些關於編寫基於 Node.js 的簡單服務器的材料。 例如,以下。

var express = require("express"),
http = require("http"), app;

// Create our Express-powered HTTP server
// and have it listen on port 3000
app = express();
http.createServer(app).listen(3000);

// set up our routes
app.get("/hello", function (req, res) {
    res.send("Hello World!");
});

app.get("/goodbye", function (req, res) {
    res.send("Goodbye World!");
});

現在,雖然我似乎明白代碼中發生了什么,但我對術語有點困惑。 當我聽到服務器這個詞時,我會想到像 Apache 或 Nginx 這樣的東西。 我習慣於將它們視為可以容納我的 Web 應用程序的容器。 Node.js 服務器與 Nginx/Apache 服務器有何不同? 難道基於 Node.js 的服務器(即代碼)仍然可以放在 Nginx 之類的東西中運行嗎? 那么為什么兩者都被稱為“服務器”呢?

這是一個服務器,是的。

node.js Web 應用程序是一個成熟的 Web 服務器,就像 Nginx 或 Apache 一樣。

您確實可以在不使用任何其他 Web 服務器的情況下為您的 node.js 應用程序提供服務。 只需將您的代碼更改為:

app = express();
http.createServer(app).listen(80); // serve HTTP directly

事實上,一些項目使用 node.js 作為其他服務器(包括 Apache)的前端負載均衡器。

請注意,node.js 並不是執行此操作的唯一開發堆棧。 Go、Java 和 Swift 中的 Web 開發框架也這樣做。

為什么?

一開始是CGI。 CGI 很好,工作正常。 Apache 會收到一個請求,發現 url 需要執行一個 CGI 應用程序,執行該 CGI 應用程序並將數據作為環境變量傳遞,讀取標准輸出並將數據提供回瀏覽器。

問題是它很慢。 當 CGI 應用程序是一個小的靜態編譯的 C 程序時是可以的,但是一組小的靜態編譯的 C 程序變得難以維護。 於是人們開始用腳本語言寫作。 然后這變得難以維護,人們開始開發面向對象的 MVC 框架。 現在我們開始遇到麻煩 - 每個請求都必須編譯所有這些類並創建所有這些對象來提供一些 HTML,即使沒有任何動態可以提供(因為框架需要弄清楚沒有任何動態可以提供)。

如果我們不需要在每個請求中創建所有這些對象怎么辦?

人們是這么想的。 從試圖解決這個問題中產生了幾種策略。 最早的方法之一是將解釋器直接嵌入到 Web 服務器中,例如 Apache 中的mod_php 編譯后的類和對象可以存儲在全局變量中,因此可以緩存。 另一種策略是進行預編譯。 另一個策略是將應用程序作為常規服務器進程運行,並使用 FastCGI 等自定義協議與 Web 服務器通信。

然后一些開發人員開始簡單地使用 HTTP 作為他們的應用程序->服務器協議。 實際上,該應用程序也是一個 HTTP 服務器。 這樣做的好處是您不需要實現任何新的、可能有問題、可能未經測試的協議,並且您可以直接使用網絡瀏覽器(或通常使用curl )調試您的應用程序。 而且您不需要修改的 Web 服務器來支持您的應用程序,只需任何可以執行反向代理或重定向的 Web 服務器。

為什么使用 Apache/Nginx?

當您提供 node.js 應用程序時,請注意您是自己的 Web 服務器的作者。 您的應用程序中的任何潛在錯誤都是互聯網上可直接利用的錯誤。 有些人(有理由)對此感到不舒服。

在您的 node.js 應用程序前面添加一層 Apache 或 Nginx 意味着您在實時互聯網上擁有一個經過實戰測試、經過安全加固的軟件,作為您的應用程序的接口。 它增加了一點延遲(反向代理),但大多數人認為這是值得的。

這曾經是 node.js 早期的標准建議。 但是現在也有一些站點和 Web 服務將 node.js 直接暴露給 Internet。 http.Server模塊現在在互聯網上經過了相當好的http.Server測試,值得信賴。

NodeJs 創建自己的服務器。 如您所見,術語非常清楚:

http.createServer(app).listen(3000);

創建一個服務器並在端口 3000 上偵聽 http 請求。

我們在我們的一個項目中使用了 nginx,但它更像是多個 nodejs 實例的負載均衡器。

假設您有兩個 nodejs 實例在端口 3000 和 3001 上運行,現在您仍然可以使用nginx作為服務器來偵聽port 80上的實際http調用,並且可能希望將您的請求重定向到nodejs服務器或其他服務器,更多就像一個loadbalancer 所以你仍然可以使用nginxnodejs提供的任何東西。

這里已經問一個好問題。

假設有一家名為 Apache Hotel 的酒店,它為每位顧客配備了一名服務員。

顧客一點了沙拉,服務員就會去找廚師告訴他。 當廚師准備食物時,服務員在等待。 在這里,

Chef => File System,

Waiter => Thread,

Customer => Event.

即使顧客點了水,服務員也是在沙拉上完之后才拿來的。 服務員一直在等待,直到廚師准備好沙拉。 這種狀態稱為阻塞狀態。 即使酒店發展壯大,每個客戶也應該有不同的服務員來服務。 這增加了線程(服務員)的阻塞。

現在,來到節點酒店,所有客人都只有一個服務員。 如果第一位顧客點了湯,服務員會告訴廚師,然后去找第二位顧客。 食物准備好后,服務員將食物送到顧客手中。 在這里,客戶不會等待。 這種狀態稱為非阻塞狀態。 單個服務員(線程)為所有客戶提供服務並讓他們開心。

因此,作為單線程應用程序的 Node 速度非常快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM