在一个端口上有一个应用程序的节点应用程序使用代理服务器(例如 node-http-proxy)有啥意义?

Posted

技术标签:

【中文标题】在一个端口上有一个应用程序的节点应用程序使用代理服务器(例如 node-http-proxy)有啥意义?【英文标题】:What is the point of using a proxy server such as node-http-proxy for a node app with a single app on one port?在一个端口上有一个应用程序的节点应用程序使用代理服务器(例如 node-http-proxy)有什么意义? 【发布时间】:2012-05-27 11:23:16 【问题描述】:

我正在探索使用node-http-proxy 代理服务器,以便我可以让我们的代理服务器在端口 80 上将请求转发到我们在端口 8000 上的应用服务器。但是,我有点困惑为什么这是一个好的想法,以及这种设置究竟会在安全方面提供什么保护。

note-http-proxy 文档讨论了很多关于将其用作将请求转发到具有多个端口或 IP 地址的应用程序的方法。这显然会非常有用,特别是对于基本的循环负载均衡器策略。但是,我们在一个端口上只有一个应用程序,所以我们没有必要这样做。

如果我们应该使用这个代理服务器有一个重要的安全原因,那么我很想知道它可以防止哪些类型的攻击。此外,我们正在使用 socket.io,所以如果代理可以帮助 websocket 服务器扩展,我也想了解这一点。我们很难弄清楚如何在没有sudo 的情况下运行我们的应用程序(因为低于 1024 的所有端口都需要 root 访问权限),所以如果此时确实没有充分的理由使用代理服务器,我们将报废。如果有人知道如何在没有 root 访问权限的情况下在端口 80 上使用代理服务器运行此应用程序,那也将非常有帮助。谢谢!

【问题讨论】:

只是好奇您为什么首先查找它?使用 nginx 之类的东西作为代理来提供静态资产或将其他请求传递给节点应用程序是很常见的。 @JustinSoliz 因为据我所知,nginx 不代理 websockets 这是一个例子,再次只是问你为什么要查找 node-http-proxy?你想用它来实现什么 @JustinSoliz 我的印象是让您的应用程序侦听私有端口并让代理将请求从公共端口转发到该私有端口是最佳实践(从安全角度来看)。有人告诉我朋友这件事,但没有告诉他原因。这就是我想弄清楚的(或者这是否是一个有效的策略)。 【参考方案1】:

运行反向代理的原因有:

您打开的 IP 端口有限,需要运行许多 Node 服务,每个服务都需要自己的端口 您的后端服务不支持 HTTPS,但您需要它(例如 Derby) 为请求添加一些后端无法轻松完成的其他功能,例如添加基本身份验证或某种形式的常见日志记录/审计 强制对多个后端服务中常见的传出响应进行添加或更改 提供负载平衡服务

除非您的需求非常简单,否则最好使用HAproxy 等专用代理,因为 node-http-proxy 相当简单。

【讨论】:

其实node-http-proxy可以很好的处理这些东西。 Nodejitsu 在生产中使用 node-http-proxy,它几乎可以完成您列表中的所有事情。它用于负载均衡和HTTPS证书,并将其他端口重定向到端口80。您也可以在node-http-proxy中add middleware to modify the requests。 也许我对它有点苛刻,但事实是它的文档记录很差,我在使用 HTTPS 时立即遇到的问题没有得到任何有用的支持。我没有理由抱怨 - 毕竟它是免费提供的 - 只是,与专用代理工具相比,它不能用于生产用途。如果有更好的文档记录,这可能会改变,拥有一个全节点工具链肯定会很好。 我发现许多节点应用程序都没有很好的文档记录......在这些情况下,文档就是代码本身(这并不总是像阅读编写良好的文档那样好)。【参考方案2】:

好吧,如果您只运行一个服务器实例,那么就没有真正的理由。 node-http-proxy 文档提到在多个应用程序中使用单个 SSL 证书,这是很有可能的。您还可以跨多个 HTTP 和 Web 套接字服务器进行负载平衡(例如,运行 10 个 socket.io 服务器来获取实时数据,但只运行 1 个 HTTP 服务器来提供资产和 REST API)。当然,在一个实例中,这些并没有带来任何好处。

如果你想在没有 sudo 的情况下运行节点服务器,也许你可以尝试设置 IP 表端口转发从端口 80 到 1024 以上的端口。见Can I run Node.JS with low privileges?

【讨论】:

您可以对任意数量的节点“服务器”使用相同的证书,只要它们从相同的 IP 地址运行即可。多个 IP 地址需要多个证书或使用通配符寻址或旧版浏览器不支持的“服务器备用名称”扩展。您不需要代理。【参考方案3】:

我们主要使用 http-proxy 在单个 IP 后面拥有多个后端服务器,但我们也使用它来将 https 转发到 http。它增强了我们的应用程序。

在安全方面,您可能对 http-proxy 的质量比您的应用更有信心。 nodejitsu 构建的代理已准备好投入生产,攻击者应该更难在 http-proxy 而不是您自己的应用程序上获得特权(例如读取私钥文件)(当然这取决于您的安全开发技能和您的信任在开源 http-proxy 项目中)。

【讨论】:

以上是关于在一个端口上有一个应用程序的节点应用程序使用代理服务器(例如 node-http-proxy)有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章

mac 上有啥可以把 socks 代理转换为全局代理的程序吗

使用 nginx 的 Websocket 代理不适用于 tomcat。

国服的lol不想打了,想去打韩服lol。在网上查了说是啥代理节点,是啥意思?家里的电信宽带是8

Yourkit UI 抛出“没有在 localhost 上运行的应用程序配置为侦听端口的分析器代理”异常

带代理的节点 GCM - 端口 443 已禁用

Nginx反向代理入门到实践