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

2022-08-30 04:51:08

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


答案 1

是的,这是一个服务器。

节点.js Web应用程序是一个成熟的Web服务器,就像Nginx或Apache一样。

您确实可以在不使用任何其他Web服务器的情况下为您的节点.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中一样。编译的类和对象可以存储在全局变量中,因此可以缓存。另一个策略是进行预编译。另一种策略是将应用程序作为常规服务器进程运行,并使用FastCGI等自定义协议与Web服务器进行通信。mod_php

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

为什么使用Apache/Nginx?

当您为节点提供服务时.js应用程序注意您是自己的Web服务器的作者。您的应用程序中的任何潜在错误都是互联网上可直接利用的错误。有些人(有理由)对此感到不舒服。

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

这曾经是node.js早期的标准建议。但是现在也有网站和Web服务直接向互联网公开node.js。该网址服务器模块现在在互联网上经过了相当好的实战测试,值得信任。


答案 2

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

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

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

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

假设您在端口 3000 和 3001 上运行了两个 nodejs 实例,现在您仍然可以用作服务器来监听您的实际调用,并且可能希望将您的请求重定向到服务器或其他服务器,更像是 .因此,您仍然可以使用提供的任何内容。nginxhttpport 80nodejsloadbalancernginxnodejs

这里已经提出了一个好问题。