Node.js "服务器"与Nginx或Apache服务器相比如何?
Node.js "服务器"与Nginx或Apache服务器相比如何?
我最近一直在学习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之类的东西中运行吗?那么为什么两者都被称为\"服务器\"呢?
NodeJs 创造了它自己的服务器。正如您所看到的,术语非常清晰:
http.createServer(app).listen(3000);
创建一个服务器并在端口 3000 上监听 http 请求。
我们在其中一个项目中使用了 nginx,不过它更像是用于多个 nodejs 实例的负载均衡器。
假设您有两个在端口 3000 和 3001 上运行的 nodejs 实例,
您现在仍然可以使用 nginx
作为服务器,监听您的实际 http
呼叫在 端口 80
上,并希望将您的请求重定向到 nodejs
服务器或其他服务器,更像是一个 负载均衡器
。因此,您仍然可以使用 nginx
提供的任何内容与 nodejs
一起使用。
这里已经有一个很好的问题here。
这是一个服务器,没错。
一个node.js web应用程序就像Nginx或Apache一样是一个完整的web服务器。
确实可以使用node.js中的代码来提供您的node.js应用程序而不使用任何其他web服务器。只需更改您的代码为:
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,即使没有任何动态内容可提供(因为框架需要找出没有动态内容可提供的情况)。
如果我们不需要在每个请求中创建所有这些对象怎么办?
人们就是这样想的。从尝试解决这个问题开始,出现了几种策略。最早的策略之一是将解释器直接嵌入Web服务器中,例如Apache中的mod_php
。编译的类和对象可以存储在全局变量中,从而可以缓存。另一种策略是进行预编译。还有一种策略是将应用程序作为常规服务器进程运行,并使用自定义协议(例如FastCGI)与Web服务器通信。
然后,一些开发人员开始简单地使用HTTP作为他们的应用程序->服务器协议。实际上,该应用程序也是一个HTTP服务器。这样做的优点是,您不需要实现任何新的、可能有漏洞、可能没有经过测试的协议,而且您可以直接使用Web浏览器(或常用的curl
)调试您的应用程序。您不需要修改Web服务器来支持您的应用程序,只需要任何可以进行反向代理或重定向的Web服务器。
为什么使用Apache/Nginx?
当您提供Node.js应用程序时,请注意,您是自己的Web服务器的作者。您的应用程序中的任何潜在错误都是可以直接利用的错误。有些人(理所当然地)对此感到不舒服。
在Node.js应用程序前添加一层Apache或Nginx意味着您在互联网上有一个经过测试和安全加固的软件作为您的应用程序的接口。它会增加一些微小的延迟(反向代理),但大多数人认为它非常值得。
这曾经是node.js早期标准的建议。但现在也有网站和Web服务直接向互联网公开 node.js。现在,http.Server
模块在互联网上经过了充分的测试,可以被信任。