我最近一直在研究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放置和服务的应用程序。
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框架。 现在我们开始遇到麻烦了 – 即使没有任何动态服务(因为框架需要弄清楚没有任何动态服务),每个REQUEST都必须编译所有这些类并创建所有这些对象来为某些HTML服务。
如果我们不需要为每个请求创建所有这些对象呢?
那是人们想的。 从试图解决这个问题出现了几个策略。 最早的一个是直接将解释器嵌入Apache中的mod_php
等web服务器。 编译的类和对象可以存储在全局变量中,因此被缓存。 另一个策略是做预编译。 而另一个策略是将应用程序作为普通的服务器进程运行,并使用FastCGI等自定义协议与Web服务器通信。
然后一些开发者开始简单地使用HTTP作为他们的app-> server协议。 实际上,该应用程序也是一个HTTP服务器。 这样做的好处是,你不需要实现任何新的,可能是错误的,可能没有经过测试的协议,你可以直接使用Web浏览器(或通常, curl
)调试你的应用程序。 而且您不需要修改的Web服务器来支持您的应用程序,只需要任何可以反向代理或重定向的Web服务器。
当您提供node.js应用程序时,请注意您是您自己的Web服务器的作者。 在你的应用程序中的任何潜在的错误是在互联网上直接可以利用的错误。 有些人(理所当然地)不舒服。
在node.js应用程序前面添加一层Apache或Nginx,意味着您在现场互联网上有一个经过测试,安全性强的软件作为应用程序的界面。 它增加了一点延迟(反向代理),但大多数人认为这是值得的。
过去,这是node.js早期的标准建议。 但是现在还有一些网站和网络服务直接向互联网公开node.js。 现在[http.server][1]
模块在互联网上经过了相当不错的测试。
NodeJs创建自己的服务器。 正如你所看到的,术语是非常明确的:
http.createserver(app).listen(3000);
创建一个服务器并监听端口3000上的http请求。
我们在我们的项目中使用了nginx,但是它更像是一个多重nodejs实例的负载均衡器。
比方说,你有两个nodejs实例在端口3000和3001上运行,现在你仍然可以使用nginx
作为服务器来监听port 80
上的实际http
调用,并且可能希望将请求重定向到nodejs
服务器或者其他服务器,更多像loadbalancer
。 所以你仍然可以使用nginx
提供的任何nodejs
。
这里已经有一个很好的问题了。