仅使用Node.js与使用Apache / Nginx的Node.js

时间:2013-05-27 09:58:33

标签: node.js

在什么情况下,人们更愿意将Node.js仅用作实际部署中的服务器?

只想使用Node.js时,Node.js的效果更好? Apache或Nginx?

6 个答案:

答案 0 :(得分:181)

在Node.js面前坚持使用另一个网络服务器有几个很好的理由:

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

我会告诉你第二个要点你应该通过CDN或像Varnish这样的缓存服务器提供静态文件。如果你这样做,那么原点是Node还是Nginx或Apache并不重要。

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

答案 1 :(得分:61)

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

答案 2 :(得分:25)

我相信,只要您知道自己在做什么,在任何情况下都可以使用Node来提供静态文件。它当然是使用应用程序服务器提供静态文件的新范例,因为许多(每个?)竞争技术(PHP,Ruby,Python等)需要在应用程序服务器前面使用HTTPD或Nginx等Web服务器

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

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

对于Nginx和Apache - 他们将与Node“玩”相同。您应该比较它们而不考虑Node。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

仅使用 Node.js

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

在另一个网络服务器上使用 Node.js

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

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

  • Nginx 可以充当负载均衡器,将流量分配到您的 NodeJS 实例(如果您的 NodeJS 实例超过 1 个)。
  • Nginx 可以为您处理HTTPS、缓存和压缩。加密和压缩是 NodeJS 不擅长的大量计算操作。因此,使用 Nginx 将为您提供更好的性能
  • Nginx 将提供静态内容,从而减少 Node.js 的负载
  • 关注点分离:Nginx 负责所有“配置”部分,Node.js 专注于应用程序逻辑。

答案 5 :(得分:0)

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