![Как использовать NVM для переключения версий Node для пользователя Apache («www-data») — пользователя с существенно ограниченными функциональными возможностями?](https://rvso.com/image/697397/%D0%9A%D0%B0%D0%BA%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20NVM%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B9%20Node%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%20Apache%20(%C2%ABwww-data%C2%BB)%20%E2%80%94%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%20%D1%81%20%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%20%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8%20%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8%3F.png)
Я вызываю скрипт 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-data
ubuntu
ubuntu
www-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
к потере доступа, и теперь мне, по всей видимости, придется перестраивать сервер с нуля.
У меня такой вопрос: как я могу установить и использовать nvm
Apache как пользователь ( www-data
), чтобы разрешить веб-серверу запускать процесс Node заданной версии и тем самым контролировать, к какой версии Node обращается веб-сервер — с удобством использования nvm
?
решение1
Короткий ответ: нет.
NVM — это скрипт оболочки, который просто устанавливает переменные окружения (в основном изменяя ваш PATH) для изменения активной node
версии. Таким образом, они не сохраняются за пределами времени жизни или дерева процессов вызывающей оболочки.
Хотя вы можете запустить свой веб-сервер с определенными переменными среды, вы не можете использовать NVM для управления ими, поскольку любой вызов nvm
будет вызван в подпроцессе вашего веб-сервера и отменен, как только команда завершится.