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

时间:2016-08-08 05:38:45

标签: javascript node.js apache nginx

我最近一直在研究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代码似乎是可以使用Nginx放置和提供的应用程序。

3 个答案:

答案 0 :(得分:84)

这是服务器,是的。

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应用程序并将数据作为环境变量传递,读取stdout并将数据提供回浏览器。

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

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

这就是人们的想法。从试图解决这个问题出来了几个策略。最早的一个是将解释器直接嵌入到Apache中的mod_php等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模块现在在互联网上经过充分的战斗测试,值得信赖。

答案 1 :(得分:10)

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

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

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

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

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

一个很好的问题已经问here

答案 2 :(得分:2)

假设有一家名为Apache Hotel的酒店,该酒店为每个顾客提供服务员。

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

Chef => File System,

Waiter => Thread,

Customer => Event.

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

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

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