基于Node.js的服务器与Apache HTTP服务器之类的东西

Gra*_*ful 63 javascript apache nginx 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!");
});
Run Code Online (Sandbox Code Playgroud)

...现在,虽然我似乎理解代码中发生了什么......我对术语有点困惑....因为当我听到术语服务器时,我会想到像Apache或Nginx这样的东西.我习惯于认为它们就像一个可以容纳我的Web应用程序的容器.Node.js服务器与Nginx/Apache服务器有何不同?基于Node.js的服务器(即代码)仍然可以放在像Nginx这样的东西中运行,这不是真的吗?那么为什么两者都被称为"服务器",尽管Node.js代码似乎是可以使用Nginx放置和提供的应用程序.

sle*_*man 104

这是服务器,是的.

node.js Web应用程序是一个完整的Web服务器,就像Nginx或Apache一样.

您确实可以在不使用任何其他Web服务器的情况下为node.js应用程序提供服务 只需将您的代码更改为:

app = express();
http.createServer(app).listen(80); // serve HTTP directly
Run Code Online (Sandbox Code Playgroud)

实际上,有些项目使用node.js作为其他服务器(包括Apache)的前端负载均衡器.

请注意,node.js不是唯一执行此操作的开发堆栈.Go,Java和Swift中的Web开发框架也是这样做的.

为什么?

一开始就是CGI.CGI很好,工作正常.Apache会收到一个请求,发现url需要执行CGI应用程序,执行该CGI应用程序并将数据作为环境变量传递,读取stdout并将数据提供回浏览器.

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

如果我们不需要为每个请求创建所有这些对象,该怎么办?

这就是人们的想法.从试图解决这个问题出来了几个策略.最早的一个是将解释器直接嵌入mod_php到Apache 中的Web服务器中.编译的类和对象可以存储在全局变量中,因此可以进行缓存.另一个策略是进行预编译.另一种策略是将应用程序作为常规服务器进程运行,并使用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模块现在在互联网上经过充分的战斗测试,值得信赖.

  • @MrfksIV Nginx和Apache2都是非阻塞的。实际上,他们在node.js出现之前就实现了非阻塞。不要使用Apache1 (3认同)
  • 我在类似的 SO 线程中读到,将 Nginx 或 Apache 层放在 Node 前面“剥夺了其非阻塞性质”。对此有什么想法吗? (2认同)

Nae*_*ikh 12

NodeJs创建自己的服务器.如您所见,术语非常明确:

http.createServer(app).listen(3000);
Run Code Online (Sandbox Code Playgroud)

创建服务器并在端口3000上侦听http请求.

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

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

一个很好的问题已经问过这里.

  • 我实际上并不太关注 nginx 本身。我想知道 node.js “服务器”和其他“服务器”(如 apache 或 nginx)之间的区别。我无法理解如何将包含的(即节点代码)等同于容器(即 apache)...但我想这种理解是不正确的。现在,我意识到 node.js 代码侦听端口 3000,就像 Apache 侦听端口 80 一样......所以我猜它们是相似的。所以说他们都是各有千秋的服务器是真的吗? (2认同)
  • createServer只创建一个侦听端口.它没有任何用处. (2认同)

小智 7

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

顾客一点了沙拉,服务员就会去找厨师告诉他。当厨师准备食物时,服务员在等待。这里,

Chef => File System,

Waiter => Thread,

Customer => Event.

即使顾客点了水,服务员也是在沙拉上完之后才拿来的。服务员一直在等待,直到厨师准备好沙拉。这种状态称为阻塞状态。即使酒店发展壮大,每个客户也应该有不同的服务员来服务。这增加了线程(服务员)的阻塞。

现在,来到节点酒店,所有客人都只有一个服务员。如果第一个顾客点了汤,服务员会告诉厨师然后去找第二个顾客。食物准备好后,服务员将食物送到顾客面前。在这里,客户不会等待。这种状态称为非阻塞状态。单个服务员(线程)为所有客户提供服务并让他们开心。

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