Ubuntu WebサーバーのNodeからPHPスクリプトを呼び出します。
// The following PHP executes in the context of the Apache user - 'www-data'
//
$execstring = "node " . $args;
exec($execstring, $output, $return_value);
前述のように、PHPコードはApacheユーザーのコンテキストで実行されます。これは、Ubuntuではデフォルトでwww-data
です。
nvm
を使用して、www-data
ユーザーのNodeバージョンを切り替えられるようにしたいと思います。
(注:別のNodeインストールへのフルパスを指定することで、nvm
を使用してNodeバージョンを切り替えることができる場合がありますなしこれはまだ試していませんが、試していません私の質問。)
指示に従って ここ 、私はnvm
をotherユーザーのために非常に簡単にインストールして使用します:
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
そして
nvm install 4.1.2
ユーザーごとにnvm
を個別にインストールする必要があることがわかりました。これは、www-data
ユーザーを実行したときにnvm
がインストールされないことを意味します。ログインユーザーとしての上記のコマンド(ubuntu
);逆に、ログインユーザー(ubuntu
)のNodeバージョンを切り替えても、www-data
ユーザーには影響しません。
もう1つの重要な詳細:www-data
ユーザーは特別です。このユーザーの機能は厳しく制限されています。シェルでwww-data
ユーザーに切り替えるには、次の特別なコマンドが必要です。
Sudo su www-data -s /bin/sh
(...そして、上記のコマンドでさえ、www-data
ユーザーにシェルプロンプトを許可するために、ここに記載されていない他の以前の特別な手順なしでは機能しません。)
www-data
ユーザーとしてログインした場合、前述のコマンドを使用してinstallnvm
はできるようですが、できませんrunnvm
。(エラーは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
アクセスが中断されたため、サーバーを最初から再構築する必要があるようです。
私の質問は次のとおりです。Apacheユーザー(www-data
)としてnvm
をインストールして使用し、Webサーバーが特定のバージョンのNodeプロセスを実行できるようにして、Node Webサーバーがアクセスします-nvm
を使用すると便利ですか?
簡単な答え:できません。
NVMは、アクティブなnode
バージョンを変更するために環境変数を設定する(主にPATHを変更する)だけのシェルスクリプトです。そのため、呼び出し元のシェルの存続期間またはプロセスツリーを超えて永続化することはありません。
特定の環境変数を使用してWebサーバーを実行できるはずですが、nvm
の呼び出しはWebサーバーのサブプロセスで呼び出され、すぐに破棄されるため、NVMを使用してそれらを管理することはできません。コマンドは終了します。