私は、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
このエラーの原因は何ですか?
このエラーを回避するために、完全な例として、which node
を使用して非シンボリック実行可能ファイルを解決できます。
Sudo apt-get install libcap2-bin
Sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
「which」コマンドは、シェルコマンドの完全パスを表示します。
理解した。しかし、ノードをインストールし、/ usr/bin/nodeに別のsym-linkを指す/ etc/alternatives/node内の別のsym-linkを指すsym-linkを作成しました。
/ usr/bin/nodejsに対してコマンドを実行すると機能しました。
FWIW、もう1つのオプションは、authbindを使用することです。 authbindは、CAP_NET_BIND_SERVICEと同様の目的を達成するために、わずかに異なるメカニズムを使用します。つまり非特権アプリが特権ポートを使用することを許可します。
Aptからインストール:
Sudo apt-get update && Sudo apt-get install authbind
目的のapp.jsが非特権ユーザー「user」で実行されていて、ポート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
代わりに「永遠に」(基本的にノードアプリをデーモン化する)のようなものを使用したい場合は、これで十分です。
authbind --deep forever app.js
setcap
コマンドが失敗することがある理由の1つは、特定のファイルシステムが拡張属性をサポートしていない場合、それがサポートされていないためです。
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
の方が優れたソリューションであることがよくあります。