在什么情况下应该更喜欢在实际部署中仅将 Node.js 用作服务器?
当不想只使用 Node.js 时,Node.js 有什么更好的选择?阿帕奇还是 Nginx?
在 Node.js 前面放置另一个 Web 服务器有几个很好的理由:
我将警告第二个要点,您可能应该通过 CDN 或从像 Varnish 这样的缓存服务器后面提供静态文件。如果您这样做,那么源是 Node、Nginx 还是 Apache 并不重要。
特别注意 nginx:如果您使用的是 websockets,请确保使用最新版本的 nginx (>= 1.3.13),因为它只是添加了对升级连接以使用 websockets 的支持。
只是为了给 pauljz 的答案添加一个理由,我使用前端服务器,以便在我重新启动后端服务器或由于某种原因崩溃时它可以提供 502 错误页面。这使您的用户永远不会收到有关无法建立连接的错误。
我相信只要您知道自己在做什么,使用 Node 来提供静态文件在任何情况下都可以。使用应用程序服务器来提供静态文件无疑是一种新的范式,因为许多(每一种?)竞争技术(PHP、Ruby、Python 等)都需要在应用程序服务器之前使用像 HTTPD 或 Nginx 这样的 Web 服务器.
我读过的反对使用 Node 提供静态文件的每一个客观原因都围绕着使用你最了解的东西或使用被认为经过更好测试/更稳定的东西的想法。实际上,这些都是非常正当的理由,但几乎没有纯粹的技术相关性。
除非您发现经典 Web 服务器可以使用 Node 无法实现的功能(我怀疑您会这样做),否则请选择您最了解或更喜欢使用的功能,因为这两种方法都可以。
至于 Nginx 与 Apache —— 他们将与 Node 一样“玩”。您应该在不考虑 Node.js 的情况下比较它们。
将 NGINX 放在 Node 前面有助于更好地处理高连接量。NGINX 提供(仅举几例) 缓存、负载平衡、速率限制(使用漏桶算法),如果与 Fail2ban 等禁止服务配合使用,可以帮助减轻攻击。
至于生产应用程序,您可以在 NGINX 后面运行您的应用程序服务器作为反向代理,再加上像 Redis 这样的缓存服务器——所有这些服务器都可以位于内容交付网络的后面,作为另一道防线,防止暴露您的 ipv4/ipv6。
Node.js 可以完成 Web 服务器的所有任务:提供静态文件、响应 API 调用、在 HTTPS 上运行服务器……还有很多包提供额外的功能,例如记录请求、压缩响应、设置 cookie,防止 XSS 攻击...缺少功能不太可能是使用另一个 Web 服务器(Apache/Nginx/etc..)来完成 Node.js的原因。换句话说,对于一个不需要扩展的简单应用程序,您不需要在 Node.js 中添加额外的层,这只会使问题复杂化。
每个 Web 服务器都有自己的优势。例如,Apache 允许通过 .htaccess 文件对每个目录进行额外的配置。Nginx 以其在提供静态文件或充当反向代理方面的性能而闻名。Node.js 在处理 I/O 繁重的系统时提供了巨大的好处……有时,我们需要结合不同 Web 服务器的力量来满足系统的要求。
示例:对于未来可能扩展的企业级应用程序,在 Node.js 应用程序具有一些优势之前将 Nginx 设置为反向代理:
一个额外的:如果你需要一个反向代理也很重要,例如在同一个端口上执行一个 Websocket 服务器,或者可能混合一些技术(用 NodeJS 回复一些请求,用 PHP 回复一些其他的或其他的)