機能が著しく制限されているユーザーである Apache ユーザー (「www-data」) の Node バージョンを NVM を使用して切り替えるにはどうすればよいでしょうか?

機能が著しく制限されているユーザーである Apache ユーザー (「www-data」) の Node バージョンを NVM を使用して切り替えるにはどうすればよいでしょうか?

私はUbuntuウェブサーバー上のPHPからNodeスクリプトを呼び出します。

// The following PHP executes in the context of the Apache user - 'www-data'
//
$execstring = "node " . $args;
exec($execstring, $output, $return_value);

www-data前述のように、PHP コードはUbuntu ではデフォルトでApache ユーザーのコンテキストで実行されます。

nvmNodeのバージョンを切り替えるために使用したいのですがwww-dataユーザー。

(注:Nodeのバージョンを切り替えることができるかもしれないそれなしnvm別の Node インストールへのフルパスを指定して使用します(まだ試していませんが、これは私の質問ではありません)。

指示に従うここ、インストールして使用するnvmのは非常に簡単です他のユーザー:

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash

そして

nvm install 4.1.2

nvmユーザーごとに個別にインストールする必要があることがわかりました。 つまり、ログイン ユーザー ( ) として上記のコマンドを実行すると、ユーザーnvmには がインストールされません。逆に、ログイン ユーザー ( ) の Node バージョンを切り替えても、ユーザーには影響がありません。www-dataubuntuubuntuwww-data

もう 1 つ重要な詳細:www-dataユーザーは特別です。このユーザーには、厳しく制限された機能があります。www-dataシェルでユーザーに切り替えるには、次の特別なコマンドが必要です。

sudo su www-data -s /bin/sh 

(...そして、上記のコマンドも、ユーザーにシェルプロンプトを表示させるために、ここでは説明されていない他の特別な手順を実行しないと機能しませんwww-data。)

www-dataただし、ユーザーとしてログインすると、インストール nvm前述のコマンドを使用すると、走る nvm (エラーは ですnvm not found。)

これを克服しようとして、私は次の提案に従うという残酷な間違いを犯しましたここユーザーとしてログインしているときに (たぶん、忘れてしまったのですが)、Node バージョンをグローバルに (つまり、すべてのユーザーに対して) 切り替えようとすると、次のrootようになります (おっと!)。

// Danger!  Do not do this!
n=$(which node);n=${n%/bin/node}; chmod -R 755 $n/bin/*; sudo cp -r $n/{bin,lib,share} /usr/local

残念ながら、上記のコマンドを実行するとsudoアクセスが切断され、サーバーを最初から再構築する必要があるようです。

nvm私の質問は、 をインストールしてApache ユーザー ( ) として使用し、www-dataWeb サーバーが特定のバージョンの Node プロセスを実行できるようにし、それによって Web サーバーがアクセスする Node のバージョンを を使用する便利さとともに制御するにはどうすればよいかということnvmです。

答え1

簡単に答えると、それはできません。

NVM は、アクティブなバージョンを変更するために環境変数を設定する (主に PATH を変更する) だけのシェル スクリプトですnode。そのため、呼び出し元のシェルの有効期間またはプロセス ツリーを超えて永続的になることはありません。

特定の環境変数を使用して Web サーバーを実行できるはずですが、 への呼び出しはnvmWeb サーバーのサブプロセスで呼び出され、コマンドが終了するとすぐに破棄されるため、NVM を使用してそれらを管理することはできません。

関連情報