是服务器.
一个 node .js web应用程序是一个成熟的web服务器,就像Nginx或Apache一样.
你确实可以为你的 node 服务.js应用程序,无需使用任何其他web服务器.只需将代码更改为:
app = express();
http.createServer(app).listen(80); // serve HTTP directly
实际上,有些项目使用node.js作为其他服务器(包括Apache)的front-end负载平衡器.
注意这个 node .js并不是唯一一个这样做的开发堆栈.Go、Java和Swift中的Web开发框架也可以做到这一点.
为什么?
一开始是CGI.CGI很好,工作正常.Apache会收到一个请求,发现url需要执行一个CGI应用程序,执行该CGI应用程序并将数据作为环境变量传递,读取stdout并将数据返回浏览器.
问题是速度太慢了.当CGI应用程序是一个小的静态编译C程序时,这没关系,但是一组小的静态编译C程序变得很难维护.于是人们开始用脚本语言写作.然后,这变得很难维护,人们开始开发面向对象的MVC框架.现在我们开始遇到麻烦了——每个请求都必须编译所有这些类,并创建所有这些对象,以便为一些HTML服务,即使没有动态服务(因为框架需要弄清楚没有动态服务).
如果我们不需要在每个请求中创建所有这些对象呢?
人们就是这么想的.为了解决这个问题,我们采取了几种策略.最早的方法之一是将解释器直接嵌入到web服务器中,比如Apache中的mod_php
.编译后的类和对象可以存储在全局变量中,因此可以缓存.另一个策略是进行预编译.还有一种策略是将应用程序作为常规服务器进程运行,并使用自定义协议(如FastCGI)与web服务器进行通信.
Then some developers started simply using HTTP as their app->server protocol. In effect, the app is also an HTTP server. The advantage of this is that you don't need to implement any new, possibly buggy, possibly not tested protocol and you can debug your app directly using a web browser (or also commonly, curl
). And you don't need a modified web server to support your app, just any web server that can do reverse proxying or redirects.
为什么要使用Apache/Nginx?
当你为一个 node 服务时.js应用程序请注意,您是自己的web服务器的作者.应用程序中的任何潜在漏洞都是互联网上可直接利用的漏洞.有些人(有理由)对此感到不舒服.
在 node 前面添加一层Apache或Nginx.js应用程序意味着你在实时互联网上有一个经过战斗测试、安全加固的软件作为你应用程序的接口.它增加了一点延迟(反向代理),但大多数人认为它值得.
这曾经是node早期的标准建议.js.但现在也有一些网站和web服务公开了 node .js直接连接到互联网.http.Server
模块现在已经在互联网上进行了相当好的作战测试,值得信赖.