我在 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 用户上下文中执行,这是www-data
Ubuntu 上的默认设置。
我希望能够使用nvm
切换 Node 版本www-data
用户。
(注:我可能能够切换 Node 版本没有通过指定不同 Node 安装的完整路径来使用nvm
- 我还没有尝试过,但这不是我的问题。)
按照指示这里,我安装并使用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
在 shell 中切换到该用户,需要执行此特殊命令:
sudo su www-data -s /bin/sh
(...并且,如果没有其他未在此处提及的特殊步骤,上述命令也无法工作,以便为用户提供 shell 提示符www-data
。)
然而,当以用户身份登录时www-data
,虽然我似乎能够安装 nvm
使用前面提到的命令,我无法跑步 nvm
。 (错误为nvm not found
。)
为了克服这个问题,我犯了一个严重的错误,听从了以下建议这里尝试以用户身份(我想是的,但现在忘记了)root
(哎呀!)登录时全局切换 Node 版本(即针对所有用户):
// 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
),以允许 Web 服务器运行给定版本的 Node 进程,从而控制 Web 服务器访问哪个版本的 Node — 使用起来很方便nvm
?
答案1
简短的回答是:你不能。
NVM 是一个 shell 脚本,它仅设置环境变量(主要是修改 PATH)来更改活动node
版本。因此,它们不会在调用 shell 的生命周期或进程树之外持久存在。
虽然您应该能够使用特定的环境变量运行您的 Web 服务器,但是您不能使用 NVM 来管理它们,因为任何调用nvm
都会在您的 Web 服务器的子进程中被调用,并且在命令终止后立即被丢弃。