Node.JS前面反向代理的优点

Posted

技术标签:

【中文标题】Node.JS前面反向代理的优点【英文标题】:Advantages of a reverse proxy in front of Node.JS 【发布时间】:2011-10-09 11:10:20 【问题描述】:

nginx 或其他 web 服务器作为反向代理在 Node.JS 前面运行有什么好处?它提供了什么?

(这个问题是针对有关网络应用程序的问题,而不是网页)。

谢谢。

【问题讨论】:

我自己最近也对同样的事情很好奇。好问题。 谢谢戴夫。伟大的思想和他们说的一样,但我想,我们很好奇。 ;-) 【参考方案1】:

当您特别处理 SSL 和 gzip 压缩时,反向代理确实有助于提高性能。此外,还有许多其他优点。谢谢 托马斯·亨特二世(内在)。在此处阅读整个博客https://medium.com/intrinsic/why-should-i-use-a-reverse-proxy-if-node-js-is-production-ready-5a079408b2ca

【讨论】:

【参考方案2】:

拥有更成熟的软件作为代理更有利于安全性和可靠性。 Nginx、Apache 等已针对大量案例进行了测试,并已在生产环境中使用多年。

您还可以使用这些 Web 服务器中的功能,否则您必须自己实现或使用 node.js 模块。比如缓存、统计、平衡等。

另一方面,你会失去 node.js 的一些功能、websockets 等实时功能(在端口 80 上,你仍然可以使用其他端口)、页面缓冲以及根据使用的反向代理、对缓存和标头的控制.

编辑:

NginX 现在支持websocket proxying 和可能的其他人。 Apache 有一个proxy websockets 的模块。

【讨论】:

您好,这绝对有道理。感谢您分享这个伟大的解释。不过,您能否解释一下,在这种情况下,我们谈论的是哪种安全性和可靠性优势? 安全性和可靠性的优势来自于这些程序比node.js更老并且在生产中使用的时间更长,通常这意味着更多的用例已经被尝试和可能错误已得到修复。虽然这是一般规则,但也有例外。恕我直言,您可以在没有反向代理的情况下使用 node.js,只需小心您的代码并始终保持最新版本。 并编写可靠的代码。通常,安全问题与您的 Web 服务器无关,而与您的应用程序有关。因此,如果您编写不安全的代码,这不是 nodejs 的缺陷,而当人们编写糟糕的 php 时,这只是 Apache 的错。记住这一点非常重要,也是大多数人出错的地方。【参考方案3】:

我认为最大的好处是您可以将同一个端口 (80) 用于多个应用程序。否则,您需要为您拥有的每个 nodejs 应用程序提供一个新的 IP 地址。根据您的设置方式,您还可以为在不同端口上运行的不同 nodejs 应用程序配置不同的文件夹和子域。如果您正在构建大型或复杂的东西,这非常棒。想象一下,能够在一个节点应用程序上运行您的 API,在另一个应用程序上运行您的网站,在另一个应用程序中运行登录的网站(会员区、仪表板等)。您的负载均衡器可以确定谁需要去哪里(example.com/api* -> api.js、example.com/dashboard* -> dashboard.js、example.com -> app.js)。这不仅对扩展有用,而且当事情破裂时,并非所有东西都立即破裂。

至于成熟,嗯。 Nodejs + forever + node-http-proxy = 太棒了。为您的所有应用程序运行 1 个代理服务器,配置/复杂性最低(失败的可能性更低)。然后享受其他一切的乐趣。不要忘记为您的内部端口设置防火墙,尽管;)

有些人注意到负载平衡,这确实是一个好处。然而,负载平衡并不是大多数人会从中受益的东西,因为单线程、非阻塞的 nodejs 线程可以处理非常大的负载。如果我是你,我真的不会认为这有什么不同。负载平衡在您需要时很容易实现,但在您这样做之前完全无用。

另外请注意,如果您使用非节点代理解决方案(nginx、tor​​nado 等),请确保不要使用会阻塞的代理解决方案。 Apache 阻止。 Nginx 不会。您不想放弃在糟糕的服务器上首先使用 nodejs 的最大好处之一。

【讨论】:

您好,感谢您的回复和解释,它非常鼓舞人心并且包含了很棒的想法。如果 nodee 只在一台机器上运行,你能告诉我“node-http-proxy”的用例是什么吗?那它会怎么做呢? 如果它只是在一台机器上运行,那么它只是充当本地代理(就像 Apache 或 Nginx 对 Node 所做的那样),除了它也是在节点上构建的! :) 这意味着您可以完全控制仅节点堆栈,您的应用程序不需要修改(它们只是工作),并且您可以在单个 IP 地址/端口(80)上运行许多、许多、许多应用程序。对于更复杂的设置,您可以构建自己的负载均衡器(多么酷!?)并以适合您的应用程序的方式分配工作。 正确!这听起来真的很棒。干杯! since a single threaded, non-blocking nodejs thread can handle quite impressively large loads -- 我试图找到一些真实世界的数字来支持这一点,但我做不到。我已经看到了疯狂的好和疯狂的坏统计数据。你能指出/提供任何东西吗? TIA 感谢迈克尔的详细说明。我认为在生产场景中,很多人都在使用 PM2 而不是 Forever。 @Cory Mawhorter 我没有这样的号码。但是你可以通过wrk 来试试你的服务器的健壮性

以上是关于Node.JS前面反向代理的优点的主要内容,如果未能解决你的问题,请参考以下文章

nginx使用反向代理支持node.js服务

安装Nginx并为node.js设置反向代理

如果Node.js已具备反向代理的功能,我为什么要使用反向代理?

将 nginx 配置为 node.js 的反向代理有啥问题?

Node.js API 网关和 nginx 作为反向代理

Nginx 反向代理 Serving Node.js app 静态文件