我在我的Ubuntu Web服务器上调用了一个来自PHP的Node脚本,如
// 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用户的节点版本 。
(注意:通过指定不同节点安装的完整path,我可以在不使用nvm的情况下切换节点版本 – 我还没有尝试过,但这不是我的问题。)
按照这里的说明,我很容易地为其他用户安装和使用nvm :
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
和
nvm install 4.1.2
我发现我必须为每个用户分别安装nvm 。 这意味着当我运行上面的命令作为login用户( ubuntu )时, nvm不会为www-data用户安装。 而相反,切换我的节点版本的login用户( ubuntu )对www-data用户没有影响。
一个更重要的细节: www-data用户是特殊的。 此用户具有严格限制的function。 要切换到shell中的www-data用户,需要使用以下特殊命令:
sudo su www-data -s /bin/sh
(…即使没有其他以前的特殊步骤,在这里没有提到,即使上面的命令也不起作用,以允许www-data用户使用shell提示符。)
但是,当以www-data用户身份login时,虽然我似乎能够使用前面提到的命令安装 nvm ,但我无法运行 nvm 。 (错误是nvm not found 。)
为了克服这个问题,我做了一个残酷的错误,在这里试图按照(我想,但是现在忘记) root用户(oops!)login的时候尝试全局切换节点版本(即所有用户):
// 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访问中断,现在我必须从头开始重build服务器。
我的问题是:如何安装和使用nvm作为Apache用户( www-data )以允许Web服务器运行给定版本的Node进程,从而控制Web服务器访问哪个版本的Node使用nvm ?
简短的回答:你不能。
NVM是一个shell脚本,只是设置环境variables(主要是修改PATH)来改变主动node版本。 因此,它们在调用shell的生命周期或进程树之外并不是持久的。
虽然您应该可以使用特定的环境variables运行Web服务器,但不能使用NVM来pipe理它们,因为任何对nvm调用都将在Web服务器的子nvm中调用,并在命令终止时立即丢弃。