252

在什么情况下应该更喜欢在实际部署中仅将 Node.js 用作服务器?

不想只使用 Node.js 时,Node.js 有什么更好的选择?阿帕奇还是 Nginx?

4

6 回答 6

232

在 Node.js 前面放置另一个 Web 服务器有几个很好的理由:

  • 不必担心 Node.js 进程的权限/setuid。通常只有 root 可以绑定到端口 80。如果你让 nginx/Apache 担心以 root 身份启动,绑定到端口 80,然后放弃它的 root 权限,这意味着你的 Node 应用程序不必担心它。
  • 提供静态文件,如图像、css、js 和 html。与使用适当的静态文件 Web 服务器相比,Node 可能效率较低(Node 在某些情况下也可能更快,但这不太可能成为常态)。除了更高效地提供文件之外,您不必担心处理 eTag 或缓存控制标头的方式,就像您从 Node. 一些框架可能会为您处理这个问题,但您需要确定一下。无论如何,仍然可能更慢。
  • 正如 Matt Sergeant 在他的回答中提到的,如果您的节点服务崩溃,您可以更轻松地显示有意义的错误页面或退回到静态站点。否则用户可能会得到一个超时的连接。
  • 在 Node 前面运行另一个 Web 服务器可能有助于缓解针对 Node 的安全漏洞和 DoS 攻击。对于一个真实的例子,CVE-2013-4450可以通过在 Node 前面运行 Nginx 之类的东西来防止。

我将警告第二个要点,您可能应该通过 CDN 或从像 Varnish 这样的缓存服务器后面提供静态文件。如果您这样做,那么源是 Node、Nginx 还是 Apache 并不重要。

特别注意 nginx:如果您使用的是 websockets,请确保使用最新版本的 nginx (>= 1.3.13),因为它只是添加了对升级连接以使用 websockets 的支持。

于 2013-05-27T10:05:24.643 回答
82

只是为了给 pauljz 的答案添加一个理由,我使用前端服务器,以便在我重新启动后端服务器或由于某种原因崩溃时它可以提供 502 错误页面。这使您的用户永远不会收到有关无法建立连接的错误。

于 2013-05-27T16:05:30.203 回答
33

我相信只要您知道自己在做什么,使用 Node 来提供静态文件在任何情况下都可以。使用应用程序服务器来提供静态文件无疑是一种新的范式,因为许多(每一种?)竞争技术(PHP、Ruby、Python 等)都需要在应用程序服务器之前使用像 HTTPD 或 Nginx 这样的 Web 服务器.

我读过的反对使用 Node 提供静态文件的每一个客观原因都围绕着使用你最了解的东西或使用被认为经过更好测试/更稳定的东西的想法。实际上,这些都是非常正当的理由,但几乎没有纯粹的技术相关性。

除非您发现经典 Web 服务器可以使用 Node 无法实现的功能(我怀疑您会这样做),否则请选择您最了解或更喜欢使用的功能,因为这两种方法都可以。

至于 Nginx 与 Apache —— 他们将与 Node 一样“玩”。您应该在不考虑 Node.js 的情况下比较它们。

于 2014-06-05T21:03:24.090 回答
6

将 NGINX 放在 Node 前面有助于更好地处理高连接量。NGINX 提供(仅举几例) 缓存负载平衡速率限制(使用漏桶算法),如果与 Fail2ban 等禁止服务配合使用,可以帮助减轻攻击。

至于生产应用程序,您可以在 NGINX 后面运行您的应用程序服务器作为反向代理,再加上像 Redis 这样的缓存服务器——所有这些服务器都可以位于内容交付网络的后面,作为另一道防线,防止暴露您的 ipv4/ipv6。

于 2021-08-06T05:57:40.350 回答
5

仅使用 Node.js

Node.js 可以完成 Web 服务器的所有任务:提供静态文件、响应 API 调用、在 HTTPS 上运行服务器……还有很多包提供额外的功能,例如记录请求、压缩响应、设置 cookie,防止 XSS 攻击...缺少功能不太可能是使用另一个 Web 服务器(Apache/Nginx/etc..)来完成 Node.js的原因。换句话说,对于一个不需要扩展的简单应用程序,您不需要在 Node.js 中添加额外的层,这只会使问题复杂化。

将 Node.js 与另一个 Web 服务器一起使用

每个 Web 服务器都有自己的优势。例如,Apache 允许通过 .htaccess 文件对每个目录进行额外的配置。Nginx 以其在提供静态文件或充当反向代理方面的性能而闻名。Node.js 在处理 I/O 繁重的系统时提供了巨大的好处……有时,我们需要结合不同 Web 服务器的力量来满足系统的要求。

示例:对于未来可能扩展的企业级应用程序,在 Node.js 应用程序具有一些优势之前将 Nginx 设置为反向代理:

  • 如果您有多个 NodeJS 实例,Nginx 可以充当负载均衡器,将流量分派到您的 NodeJS 实例。
  • Nginx 可以为您处理HTTPS、缓存和压缩。加密和压缩是 NodeJS 不擅长的大量计算操作。所以使用 Nginx 会给你更好的性能
  • Nginx 将提供静态内容,从而减少Node.js的负载。
  • 关注点分离:Nginx 负责所有“配置”部分,Node.js 专注于应用程序逻辑。
于 2021-08-04T19:37:16.287 回答
4

一个额外的:如果你需要一个反向代理也很重要,例如在同一个端口上执行一个 Websocket 服务器,或者可能混合一些技术(用 NodeJS 回复一些请求,用 PHP 回复一些其他的或其他的)

于 2019-07-05T16:26:52.803 回答