什么端口应该由node.js监听?如何以及为什么要这样做?

9

我的node.js应用程序监听80端口的http和443端口的https,我认为这是相当标准的做法。

然而,最近我阅读的一些示例使用其他端口(例如8080和8081)来监听http/https,然后使用其他方法(例如iptables或ufw规则)通过重新路由数据包从其他端口提供80/443端口。

请参见两个示例herehere

因此,我的问题是为什么我不想直接监听80和443端口?

是否存在安全问题?这只是这些作者没有权限监听低于1024端口的情况吗?(我觉得这很惊讶?)大多数人是否在Node旁边运行Apache?(我没有)。

假设我有充分的理由不想直接监听80和/或443端口,我应该使用哪种方法将流量从80/433端口中继到我选择的备选端口? 我已经提到了iptables和ufw,其中一个比另一个更好,还是我应该使用其他方法?答案是否取决于我是否在进程之间平衡负载?
提前致谢。

2
我认为这是因为你需要 root 权限才能在低于 1024 的端口上运行,而你不希望你的应用程序拥有 root 权限。不过,仍然有办法绑定它。我个人使用 AuthBind。(AuthBind 是一个工具,可以允许非特权用户在特权端口上绑定和监听网络服务。) - VeXii
2
如果我没记错的话,端口号1337正在成为运行Node.js的标准。要执行应用程序,可以使用NGINX作为反向代理服务器。 - Uday Hiwarale
1个回答

16

您链接的第一篇文章中的第一行提到了原因。

Standard practices say no non-root process gets to talk to
the Internet on a port less than 1024.

为了让Node绑定到端口80443,你需要以root身份运行它,但这不是一个好主意。

您用于重新路由流量到更高端口的方法取决于您自己。 iptables是资源消耗最少且最简单的方法。另一种方法是使用NginX / Apache代理到Node。我认为该方法的主要优点是您随后可以从那里提供诸如静态文件之类的内容,而无需通过Node提供它们。

Apache和NginX都是专门设计用于非常擅长服务静态文件,因此它们在这方面非常出色,而Node是一个完整的JS环境,其中包含所有相关的开销。 Node非常擅长处理大量同时连接,并且对于正常负载它确实可以很好地提供文件,但它会比NginX使用更多资源来完成它。

使用像Apache / NginX这样的HTTP感知代理还意味着您可以非常轻松地设置多个Node实例以运行不同的子域或甚至是同一域上的不同路径。


使用NginX / Apache来提供文件与使用Node相比有哪些好处? - Joshua
1
@loganfsmyth: 但是如果你使用 Apache 或 NginX 的方法...这意味着这些服务器需要 root 权限才能监听端口80,对吧?那么为什么它对它们不是问题,对 node.js 却是问题呢? - Manfred
那些服务器不会以您的用户身份运行。当您启动它们时,通常是告诉它们开始运行,然后它们会切换到以自己的用户身份运行,并且为它们设置安装脚本已经设置了其用户以访问这些端口。如果您真的想要,您可以为自己的用户执行相同的操作,但大多数人在某些代理后面运行Node。 - loganfsmyth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接