我正在按照指南在 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
通常是一个更好的解决方案。