与 Nginx 或 Apache 服务器相比,Node.js“服务器”如何?

我最近一直在研究 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 应用程序。Js 服务器与 Nginx/Apache 服务器有什么不同?基于 Node.js 的服务器(即代码)是否仍然可以放在类似 Nginx 的东西中运行?那么,为什么两者都被称为“服务器”呢?

72170 次浏览

NodeJs 创建自己的服务器:

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

创建一个服务器并监听端口3000上的 http 请求。

我们在一个项目中使用了 nginx,但它更像是多个 nodejs 实例的负载平衡器。

假设有两个 nodejs 实例在端口3000和3001上运行, 现在您仍然可以使用 nginx作为服务器来监听 port 80上的实际 http调用,并且可能希望将请求重定向到 nodejs服务器或其他服务器,更像是 loadbalancer。所以您仍然可以使用 nginxnodejs提供的任何东西。

一个好问题已经问了 给你

是个服务器,没错。

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 很好,工作正常。Apache 会收到一个请求,发现 URL 需要执行一个 CGI 应用程序,执行该 CGI 应用程序并将数据作为环境变量传递,读取标准输出并将数据返回给浏览器。

问题是它太慢了。当 CGI 应用程序是一个小的静态编译的 C 程序,但是一组小的静态编译的 C 程序变得难以维护时,这是可以的。所以人们开始用脚本语言写作。然后这变得很难维护,人们开始开发面向对象的 MVC 框架。现在我们开始有麻烦了——每个请求都必须编译所有这些类并创建所有这些对象,只是为了服务一些 HTML,即使没有什么动态的服务(因为框架需要弄清楚没有什么动态的服务)。

如果我们不需要每个请求都创建所有这些对象呢?

大家都是这么想的。为了解决这个问题,我们采取了几种策略。最早的方法之一是将解释器直接嵌入 Web 服务器,比如 Apache 中的 mod_php。编译的类和对象可以存储在全局变量中,因此可以缓存。另一种策略是进行预编译。还有一种策略是将应用程序作为常规服务器进程运行,并使用 FastCGI 这样的自定义协议与 Web 服务器进行对话。

然后,一些开发人员开始简单地使用 HTTP 作为他们的 app-> 服务器协议。实际上,这个应用程序也是一个 HTTP 服务器。这样做的好处是你不需要实现任何新的,可能有错误的,可能没有测试过的协议,你可以直接使用 web 浏览器来调试你的应用程序(通常也是 curl)。而且你不需要一个修改过的 web 服务器来支持你的应用,只需要任何可以做反向代理或重定向的 web 服务器。

为什么使用 Apache/Nginx?

当你提供一个 node.js 应用程序时,请注意你是你自己的 web 服务器的作者。任何潜在的漏洞在您的应用程序是一个直接利用的漏洞在互联网上。有些人(理所当然地)对此感到不舒服。

在 node.js 应用程序前面添加一个 Apache 或 Nginx 层意味着在实时互联网上有一个经过战斗考验的、经过安全考验的软件,作为应用程序的界面。它增加了一点点延迟(反向代理) ,但大多数人认为这是值得的。

这曾经是 node.js 早期的标准建议。但是现在也有一些网站和 Web 服务将 node.js 直接暴露在互联网上。http.Server模块现在已经在互联网上经过了相当好的实战测试,值得信赖。

假设有一家名为 Apache Hotel 的酒店,为每位顾客配备一名服务员。

顾客一点沙拉,服务员就去告诉厨师。当厨师准备食物时,服务员在等待。给你,

Chef => File System,

Waiter => Thread,

Customer => Event.

即使顾客点了水,服务员也只是在上完沙拉后才端上来。 服务员一直等到主厨准备好沙拉。这种状态称为阻塞状态。即使酒店规模扩大,每个顾客也应该有不同的服务员。这增加了线程(服务器)的阻塞。

现在,来到 Node 酒店,所有的顾客只有一个服务员。如果第一位顾客点了汤,服务员会告诉厨师,然后去找第二位顾客。食物准备好后,服务员把食物送到顾客面前。在这里顾客不会等待。此状态称为非阻塞状态。单一的服务员(线程)服务所有的客户,使他们高兴。

因此,作为单线程应用程序的 Node 非常快。