web-dev-qa-db-ja.com

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

このエラーの原因は何ですか?

9
ThinkingInBits

このエラーを回避するために、完全な例として、which nodeを使用して非シンボリック実行可能ファイルを解決できます。

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

「which」コマンドは、シェルコマンドの完全パスを表示します。

11
Alejandro Silva

理解した。しかし、ノードをインストールし、/ usr/bin/nodeに別のsym-linkを指す/ etc/alternatives/node内の別のsym-linkを指すsym-linkを作成しました。

/ usr/bin/nodejsに対してコマンドを実行すると機能しました。

4
ThinkingInBits

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
3
Jeremy Davis

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の方が優れたソリューションであることがよくあります。

1
EdH