我们可以说node.js是一个Web服务器吗?

124

我发现我对web框架和web服务器感到困惑。

  • Apache是一个web服务器。
  • Tornado是用Python编写的web服务器。
  • Nginx是用C编写的web服务器。
  • Zend是一个php web框架。
  • Flask/Bottle是一个用Python编写的web框架。
  • RoR是一个用Ruby编写的web框架。
  • Express是一个在Node.JS下用JS编写的web框架。

我们可以说Node.js是一个web服务器吗?

如果某种程度上来说Node.js是一种Web服务器,而不是Web框架(Express是),那么在实际应用中为什么需要将整个Node.js放在Nginx服务器之上呢?


7
Tornado是一个Web服务器和一个小型Web框架。 :) 我认为ezpresso是正确的。Node.js实际上是一个类似于Java的JRE的运行时环境。 Node.js越来越多地用于非Web应用程序。使用Node.js编写的程序没有Web服务器功能,除非您添加它。确实,Node.js具有非常高级的本机函数,可以让您轻松地使用http.CreateServer(...).listen(80)创建Web服务器。但是,除非您添加此功能,否则程序中不存在Web服务器。因此,Node.js本身不是Web服务器。相反,您使用Node.js创建Web服务器。 - OCDev
4
严格来说,你不需要在Node.js上放置一个Web服务器 - 你可以在你的Node项目中编写一个小型服务器,让它处理所有常规的浏览器请求以及与Web应用程序有关的特定请求。但是,像网页更改这样的事情,使用Web服务器(例如Nginx)来处理更好。因此,虽然您不必将Web服务器与Node联系起来,但这样做通常更明智。 - Trunk
2
C++是一个Web服务器吗?不,它是一种编程语言,您可以使用它来编写一个。Node.js也是如此。 - alfadog67
10个回答

67

网络服务器

网络服务器可以指硬件(计算机)或软件(计算机应用程序),它有助于传递可通过互联网访问的内容。1

Web服务器的主要功能是在客户端请求时提供网页。这意味着提供HTML文档和任何可能包含在文档中的其他内容,例如图像、样式表和脚本。

网络服务器是向客户端/用户提供互联网请求/页面的基础。

Web框架

Web应用程序框架是一种软件框架,旨在支持动态网站、Web应用程序和Web服务的开发。该框架旨在减轻Web开发中常见活动所带来的开销。例如,许多框架提供数据库访问库、模板框架和会话管理,并经常促进代码重用。

一个Web框架使用Web服务器将请求发送给客户端,但它本身不是Web服务器。

Node.js

Node.js是一个基于Chrome的JavaScript运行时构建的平台,用于轻松构建快速、可伸缩的网络应用程序。Node.js使用事件驱动、非阻塞I/O模型,使其轻巧高效,非常适合在分布式设备上运行的数据密集型实时应用程序。
但是您也可以创建CLI应用程序,因此我认为您应该将其视为使用Javascript 编程语言编写javascript程序在服务器(计算机)上运行的平台,而不仅仅是在浏览器中。我认为您可以将其看作Javascript++
您还可以使用node.js编写Web服务器,如您在node.js首页上所见。一开始Ryan说您可以在node.js前面放置Nginx,因为该项目的稳定性。该项目一开始非常年轻,现在仍然很年轻。Nginx是一个经过验证的Web服务器,可以保持运行,而node.js可能会崩溃。不过,很多用户仍然只使用node.js。

8
Node.js是一个建立在Google的V8 JavaScript引擎之上的JavaScript运行时。 - ozanmuyes
1
Web服务器(如apache或nginx)如何成为硬件? - ns15
我认为主要问题是Node.js是否默认监听HTTP端口?如果是,则将其归类为HTTP服务器。 - forsberg
1
我们可以说正方形是矩形,但反过来不行。你是在说Nodejs不仅仅是一个Web服务器吗?还是它根本不代表一个Web服务器? - CME64
1
@shadow0359 有点晚了,但对于其他看到这条信息的人来说,网络服务器不仅是软件。它还可以指物理硬件,也就是运行软件的计算机。 - Chris
1
我认为这可能会令人困惑,因为当我们参考文档 https://nodejs.org/en/docs/guides/getting-started-guide/ 时,它说我们可以使用NodeJS构建Web服务器。人们包括我自己都很困惑,是否可以通过编写10-15行代码来启用NodeJS的Web服务器功能。 - keylogger

29
我会说 Node.js 是一个运行时环境或运行引擎。
可能迄今为止我找到的最好的定义来自 Rob Gravelle 的一篇文章,题为"介绍 Node.js"

Node.js 既是运行时环境又是库,用于使用服务器端 JavaScript 构建网络应用程序。它使用 Chrome 的 JavaScript 运行引擎直接执行 JS 代码,无需浏览器沙盒。

此外,PCMAG.COM 百科全书提供了“运行时引擎”的以下定义
运行时引擎是某些应用程序在计算机上运行所依赖的软件。应用程序需要在计算机上运行该运行时引擎才能执行。它提供了应用程序所需的常见例程和函数,并且通常将处于中间状态的程序转换为机器语言。同样,名为“运行时系统”的维基百科文章声明:“运行时系统(也称为运行时系统、运行环境或仅称为运行时)实现了计算机语言的基本行为,无论该语言是编译语言、解释语言、嵌入式领域特定语言还是通过 API 调用的 pthreads。”运行时系统可以实现像在屏幕上绘制文本或建立互联网连接等任务的行为。它通常还充当一个抽象层,隐藏操作系统提供的服务的复杂性或变化。那么,是否存在像 Node.js 这样的运行时环境(甚至是软件平台)?我想 JRE 就是这种环境的很好的例子。Node.js 和 JRE - 它们有许多共同点。它们都有(一种)虚拟机、一个类库和一个框架来实现许多类型的应用程序,包括 CLI 应用程序。
所以,回到你的问题,我们能否说Node.js是一个Web服务器?让我们把“Node.js”改为“JRE”,并回答JRE是否是Web服务器。答案是否定的。
我们所能说的就是Node.js是一个运行时环境,可以用来实现Web服务器。好吧,这是我的看法。

你忽略了在第一时间拥有该运行时的目的,以及没有所有[https://nodejs.org/docs/latest-v9.x/api/]必要模块的无用性,这些模块对于使其真正有用非常重要。 - Trunk

27

将node称为Web服务器就好比说JavaScript只能在浏览器中运行,虽然这样说没错,但它还可以做许多其他事情。

NodeJS

  1. [JavaScript运行环境(Chrome v8引擎)+ Node库/ API]
  2. 可以创建Web服务器,也可以描述为应用程序服务器

Express

  1. Web框架(使用Node.js的Web服务器提供文件服务)

Nginx

  1. Web服务器

在生产环境中,大多数人都会在Node服务器前面使用Nginx作为代理服务器,以提供静态文件和其他各种元素,如缓存、路由等。


3
提到NodeJS既可以用作Web服务器又可以用作应用服务器,以及提到Express,加一分。 - Yahya

18

我认为 node.js 是一个服务器框架,并且有很多可以用它做 HTTP 服务器、WebSocket 服务器、自定义协议等的包。

你在 node.js 服务器前面加上 nginx 的原因是为了在多台运行服务器应用程序的机器之间进行 HTTP 负载均衡和反向代理。


1
是的。Web框架可以帮助你编写Web应用程序,使用HTML和JavaScript来构建用户界面,并通过HTTP进行通信。一些Web框架的例子包括node.js的Express或Python的Django。 - cmv
1
所有尝试中最好的答案。+1。 - Trunk
我猜使用NGINX不是一个合适的解决方案,我们可以使用HS代理来实现负载均衡。 - Kartikeya Sharma
@cmv 抱歉我来晚了!但是你必须在 Node 前面放置 nginx 才能使用负载均衡器吗?我可以直接将负载均衡器放在 EC2 实例前面,让它直接传输到 Node 和 Express 端点,这样就完成了吗? - lopezdp

13

我能感同身受!跟许多人一样,我发现很难理解Node.js的实质,因为大部分人只写/谈论他们所使用的Node部分 - 而他们感兴趣的部分通常是作为Node的次要好处而不是其主要目的。我必须说,我认为人们说Node只是JavaScript运行时简直是疯了。Node对JavaScript的使用 - 以及选择V8运行时 - 只是一种手段,是Node开发者想要解决问题的最佳工具。

Node的主要目的是使网页应用程序中用户事件的管理更加高效。因此,Node在Web应用程序的后端被极大地使用。事件管理需要在服务器机器上有监听这些用户事件的东西。因此,必须设置一个HTTP服务器来将每个事件路由到其相应的处理程序脚本。Node提供了快速设置服务器以便在专用端口上侦听用户请求的框架。Node使用JavaScript来处理事件,因为JavaScript允许函数作为对象进行调用。这允许任务立即在异步请求(例如文件系统、数据库或网络)之后执行,并将其封装在函数中,并将其引用作为异步请求函数调用的参数。

const mysql = require('mysql2');

const conn = mysql.createConnection(
{
    host: "XXXXXXXXXXXXX",
    database: "doa_statsbase",
    user: "uoalabama_doas",
    password: "*************"
});
. . . 
. . . 
const analyse_bigwheat_farmers = (err, result, fields) =>
{
    . . . . .
    . . . . .
    return data_object;
}
. . . 
. . .
let query = "SELECT * FROM us_farmers WHERE acreage > '1000' AND crop='wheat'"; 

mysql.query(query, (err, result, fields) =>
{
   analyse_bigwheat_farmers(err, result, fields);
}
. . . 
. . . 
. . . 
不多数语言将函数视为对象,而那些这样做的语言可能没有像Google的V8运行时一样高效的解释器。大多数Web开发人员已经了解JavaScript,因此在使用Node时无需学习其他语言。拥有回调函数使所有用户任务能够放置在单个线程上,而不需要将显式阻塞应用于需要访问数据库或文件系统的任务。这就是在重度并发使用下导致Node具有优越执行效率的原因 - 这是其开发的主要目的。
如今,大多数Node Web应用程序仅适度使用回调函数,因为JavaScript ES6于2015年引入了“Promise”构造,以更轻松和可读的方式处理异步调用。
为了帮助Node用户快速编写后端代码,Node的开发人员还组织了一个内置的JS库,用于常规任务(例如与HTTP请求、字符串(解)编码、流等相关的事项),以及NPM(Node Package Manager)存储库:这是一个开源的、由用户维护的脚本包集,用于各种标准和自定义功能。通过已建立的“npm install”命令,所有Node项目都允许将NPM包导入到项目中。
通过Node处理的用户请求将是Web应用程序所需的内容,例如身份验证、数据库查询、内容管理系统(ApostropheCMS、Strapi CMS)更新等。所有这些请求都将被发送到Node端口。(由数据库得到的数据的分析需要大量的CPU时间,这种类型的处理最好放在单独的线程中,以便不会减缓更简单的用户请求。)其他类型的用户请求(例如加载另一个网页、下载CSS/JS/image文件等)将继续由浏览器发送到默认端口(通常是服务器机器上的端口80(HTTP)和443(HTTPS),其中Web服务器程序(Apache、NGinx等)将以传统网站的模式处理它们。
在此对服务器的请求进行流式传输的一个副备注释。由于大多数服务器机器的防火墙只允许默认端口80/443打开,因此通常不允许在URL中直接发送带有另一个端口的Node.js请求,例如https://mynodeapp.com:3001/fetch-members。如果这样做,服务器机器的防火墙将简单地忽略它,因为它直接引用了非法端口。 相反,可以将一个不含显式端口号但包含标识Node.js应用程序的虚拟文件夹名称的URL应用于该请求,例如https://mynodeapp.com/mynodeapp/fetch-members。然后,在.htaccess文件中附加一些服务器指令代码:
RewriteEngine On
RewriteRule ^mynodeapp/(.*) https://localhost:3001/$1 [P]

因此,以这种方式给定的URL请求将通过Node应用程序的指定端口(例如在此示例中为3001)找到其路径,最终到达Node.js服务器,用于快速创建服务器和处理事件的框架,但仅替换Web服务器程序的某些功能。

Node的其他非后端用途只是利用其某些功能,例如JavaScript V8引擎。例如,前端构建工具Grunt和Gulp使用前端Node.js应用程序来处理可以编码转换SASS为CSS、压缩CSS/JS文件、优化图像大小或图像加载、为单页应用程序网站生成页面状态HTML文件等的构建脚本。但这种工作实际上只是Node的副产品用途,而不是其主要用途,其主要用途是为现代Web应用程序制作高效的后端进程。


1
我认为问题在于“Web服务器”或“Web应用程序服务器”的术语被JEE世界所主导,而这些产品不像今天的JavaScript框架世界那样模块化,这反过来可以更或多或少地自由组合。
我看不出为什么一种能够通过Web提供复杂应用程序的技术不应该被称为Web服务器或Web应用程序服务器!
如果您将Nuxt作为前端与Feathers作为后端结合使用,则会有一个后端提供REST API和服务器端呈现的UI!
当然,您可以(误)用它来提供静态内容 - 那么我会称其为Web服务器,或者您可以使用它来制作和提供完整的应用程序 - 那么我会称其为Web应用程序服务器。
正是综合特征或质量总结出了服务目的 - 对吧? - 像稳定性、可扩展性等功能是我个人认为随着时间的推移将添加到这些技术中的。目前,它们仍然相当新颖。

1

Web服务器是通过互联网协议为其客户提供服务的东西,而Web框架则类似于我们所称的编译器。它包含所有必需的库、语法规则等。

而Node.js就是一个框架!!


2
但是 Node 不包括模块(例如 http)吗?这些模块旨在使人们能够快速编写自己的服务器。 - Trunk

0

我第一次使用Node.js创建Discord机器人。我的想法是:“哇,Node.js是一个服务器吗?我以为它只是一个JS库!”或者我可以把它看作是一个框架。

它是一个Web服务器吗?不是,但你可以用它来创建一个Web服务器。 它是一个服务器吗?就像接收查询并提供结果的软件?是的。

在我的情况下,我发出了以下命令: node index.js

现在,Node.js正在等待请求(通过我的机器人)进行响应。它是一个服务器,但它不提供Web页面。


0

尽管Nodejs被视为一个相当酷炫、轻量级的运行环境,并且在node生态系统中包含了一个很棒的包管理器npm。你可以使用express框架快速搭建REST API和Web应用程序服务器,它们可以服务于专用端口,而且不需要额外的Web服务器。 而Web服务器的主要任务是作为第7层负载均衡器和代理服务器。根据行业标准,最常用的Web服务器是nginx,因为它非常可靠。虽然你也可以使用Node库和express框架来配置HTTP代理服务器。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

不,它是一个运行时环境...因此它还不是一个Web服务器,但它不需要Web服务器来运行。这可能是为什么会令人困惑的原因。它可以独立运行,而不需要任何Web服务器,因为它本身就是一个运行时环境,但它并不是一个Web服务器。


4
我认为这个答案虽然在技术上是正确的,但对新手来说过于简略,缺乏信息性。 - Trunk
你的回答暗示了运行时可以执行Web服务器的功能,这是不正确的。 - ahnbizcad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接