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


86

我最近一直在研究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之类的文件中运行吗?那么为什么都被称为“服务器”呢?


2
Isn't it true that a Node.js based server (i.e. code) will still be placed within something like Nginx to run?不,那是不正确的
Jaromanda X

1
从技术上讲,您可以运行您的应用程序,并让节点将其提供给客户端,以有效地充当Web服务器的角色,但是您所遭受的痛苦可能超出您的期望。我最近阅读了有关该主题的精彩文章:nginx.com/blog/nginx-vs-apache-our-view
datafunk

1
让我澄清一下,当我要求两者之间的区别时,我并没有考虑apache vs nginx。我正在研究Node.js与Nginx。
感谢

1
不要让标题误导您。如果您读了这篇文章,您会明白为什么我说,尽管您可以自己做,但您可能不想...
datafunk

Answers:


127

是服务器,是的。

就像Nginx或Apache一样,node.js Web应用程序是功能完善的Web服务器。

您确实可以在不使用任何其他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服务器中,例如mod_php在Apache中。编译的类和对象可以存储在全局变量中,因此可以进行缓存。另一种策略是进行预编译。还有另一种策略是将应用程序作为常规服务器进程运行,并使用诸如FastCGI之类的自定义协议与Web服务器对话。

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

为什么要使用Apache / Nginx?

提供Node.js应用程序时,请注意您是您自己的Web服务器的作者。您应用中的任何潜在错误都是互联网上可直接利用的错误。有些人对此(合理地)不满意。

在node.js应用程序之前添加Apache或Nginx层,意味着您可以在实时互联网上拥有经过测试,经过安全加固的软件,作为与应用程序的接口。它增加了一点延迟(反向代理),但大多数人认为值得。

这曾经是node.js早期的标准建议。但是这些天来,还有一些站点和Web服务将Node.js直接暴露给了互联网。该http.Server模块现在已经在互联网上经过了严格的测试,可以信赖。


1
我已经读过类似的SO线程,这些知识将Nginx或Apache层放在Node的前面,“消除了它的非阻塞性质”。有什么想法吗?
MrfksIV

3
@MrfksIV Nginx和Apache2都是非阻塞的。实际上,他们早在node.js出现之前就实现了非阻塞。不要使用Apache1
slebetman

14

NodeJs创建自己的服务器。如您所见,术语非常清楚:

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

创建一个服务器,并在端口3000上侦听http请求。

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

假设您有两个在端口3000和3001上运行的nodejs实例,现在您仍然可以nginx用作服务器来侦听实际的http呼叫port 80,并且可能希望将请求重定向到nodejs服务器或其他一些服务器,例如loadbalancer。因此,您仍然可以使用nginx提供的任何功能nodejs

这里已经问一个好问题。


1
实际上,我不太关注nginx本身。我想知道node.js“服务器”与其他“服务器”(如apache或nginx)之间的区别。我不明白所包含的(即节点代码)如何等同于容器(即apache)……但是我想这种理解是不正确的。现在,我意识到node.js代码侦听端口3000就像Apache侦听端口80...。所以我想它们是相似的。因此,可以说它们都是具有自己优点和缺点的服务器吗?
感谢

2
createServer只是创建一个侦听端口。它没有任何作用。
罗杰F.盖伊

1
如果nodejs不会根据对端口的请求提供服务,那么让nodejs使用createServer侦听端口有什么意义呢?...因此,通过逻辑扩展名是“服务器”的一种方法,不是吗?
GG2

@ RogerF.Gay ...它在指定的端口上创建一个侦听器,并对传入的请求执行回调函数。多数民众赞成在我会说它创建一个服务器。
Naeem Shaikh,

1
@Naeem Shaikh它没有任何作用。调用不能为服务器提供任何服务的东西是没有意义的。
罗杰·盖伊

1

假设有一家名为Apache Hotel的酒店,每个客户都有一个服务员。

客户点好沙拉后,服务员便去找厨师并告诉他。当厨师准备食物时,服务员等待。这里,

Chef => File System,

Waiter => Thread,

Customer => Event.

即使客户订购水,服务员也只有在供应沙拉后才带水。服务员一直等到厨师准备沙拉。该状态称为阻塞状态。即使酒店发展壮大,每个客户也应有不同的服务生来服务。这增加了线程(侍者)的阻塞。

现在,来到Node Hotel,所有顾客只有一名服务员。如果第一位顾客点了汤,服务生会告诉厨师,然后去第二位顾客。食物准备好后,服务员将食物交付给顾客。客户在这里不会等待。该状态称为非阻止状态。单个服务员(线程)为所有客户提供服务,并使他们感到满意。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.