允许 node.js 应用程序在端口 80 上运行

允许 node.js 应用程序在端口 80 上运行

我正在按照指南在 ubuntu 机器上设置节点。我正处于配置系统以允许节点在端口 80 上运行的步骤。它(以及我看过的其他一些指南)建议运行以下命令:

sudo setcap cap_net_bind_service=+ep /usr/local/bin/node

这将返回以下错误:

Failed to set capabilities on file `/usr/local/bin/node' (Invalid argument)
The value of the capability argument is not permitted for a file. Or the file is not a regular (non-symlink) file

知道什么可能导致此错误吗?

答案1

为了避免此错误,您可以使用 解析非符号链接可执行文件which node,完整示例如下:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

“which”命令显示shell命令的完整路径。

答案2

搞清楚了。结果发现,我安装了 node,在 /usr/bin/node 中创建了一个符号链接,该符号链接指向 /etc/alternatives/node 中的另一个符号链接,而 /etc/alternatives/node 中的另一个符号链接又指向 /usr/bin/nodejs 中的另一个符号链接。

针对 /usr/bin/nodejs 运行命令有效。

答案3

值得一提的是,另一个选择是使用 authbind。Authbind 使用略有不同的机制来实现与 CAP_NET_BIND_SERVICE 类似的目的。即允许非特权应用程序使用特权端口。

从 apt 安装:

sudo apt-get update && sudo apt-get install authbind

假设所需的 app.js 在非特权用户“用户”下运行,并且您希望绑定到端口 80:

sudo touch /etc/authbind/byport/80
sudo chown user:user /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80

然后像这样运行你的应用程序:

authbind node app.js

如果你希望使用“forever”之类的东西(本质上守护节点应用程序),那么就可以这样做:

authbind --deep forever app.js

答案4

setcap命令有时会失败的一个原因是,如果某些文件系统不支持扩展属性,则它们不支持该命令。

The filesystem must support attaching capabilities to an executable file, so that a process gains those capabilities when the file is executed.

http://man7.org/linux/man-pages/man7/capabilities.7.html

对于 Docker 来说尤其如此。Docker 使用 BTRFS 或 AUFS 存储后端,但也可以使用 overlayfs。Overlayfs 支持设置上限,但 BTRFS 和 AUFS(见下文)不支持。

https://github.com/moby/moby/issues/30557

如果您需要使用 AUFS 运行图像,则必须运行带有 的内核CONFIG_AUFS_XATTR=y

因为这个原因authbind通常是一个更好的解决方案。

相关内容