Как использовать NVM для переключения версий Node для пользователя Apache («www-data») — пользователя с существенно ограниченными функциональными возможностями?

Как использовать NVM для переключения версий Node для пользователя Apache («www-data») — пользователя с существенно ограниченными функциональными возможностями?

Я вызываю скрипт Node из PHP на моем веб-сервере Ubuntu, как показано ниже:

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

Как уже отмечалось, PHP-код выполняется в контексте пользователя Apache, который используется www-dataпо умолчанию в Ubuntu.

Я хотел бы иметь возможность использовать nvmдля переключения версий Nodewww-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

Еще одна важная деталь: 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к потере доступа, и теперь мне, по всей видимости, придется перестраивать сервер с нуля.

У меня такой вопрос: как я могу установить и использовать nvmApache как пользователь ( www-data), чтобы разрешить веб-серверу запускать процесс Node заданной версии и тем самым контролировать, к какой версии Node обращается веб-сервер — с удобством использования nvm?

решение1

Короткий ответ: нет.

NVM — это скрипт оболочки, который просто устанавливает переменные окружения (в основном изменяя ваш PATH) для изменения активной nodeверсии. Таким образом, они не сохраняются за пределами времени жизни или дерева процессов вызывающей оболочки.

Хотя вы можете запустить свой веб-сервер с определенными переменными среды, вы не можете использовать NVM для управления ими, поскольку любой вызов nvmбудет вызван в подпроцессе вашего веб-сервера и отменен, как только команда завершится.

Связанный контент