Como usar o NVM para alternar as versões do nó para o usuário do Apache ('www-data') - um usuário com funcionalidade severamente limitada?

1

Eu chamo um script de Node do PHP no meu servidor web Ubuntu, como em

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

Como mencionado, o código PHP é executado no contexto do usuário do Apache, que é www-data no Ubuntu.

Gostaria de poder usar nvm para alternar as versões do Node para o usuário www-data .

(Nota: Eu posso trocar as versões do Node sem usando nvm especificando o caminho completo para uma instalação diferente do Node - ainda não tentei isso, mas não é minha pergunta. )

Seguindo as instruções aqui , eu instalo e uso nvm com bastante facilidade para outros usuários:

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash

e

nvm install 4.1.2

Descobri que devo instalar nvm separadamente para cada usuário. Isso significa que nvm não é instalado para o usuário www-data quando eu executo o comando acima como o usuário de login (%código%); e, inversamente, mudar minha versão do Node para o usuário de login ( ubuntu ) não tem efeito sobre o usuário ubuntu .

Mais um detalhe importante: o usuário www-data é especial. Este usuário restringiu severamente a funcionalidade. Para alternar para o usuário www-data no shell, esse comando especial é necessário:

sudo su www-data -s /bin/sh 

(... E mesmo o comando acima não funcionará sem outras etapas especiais anteriores, não mencionadas aqui, para permitir um prompt do shell para o usuário www-data ).

Quando logado como usuário www-data , no entanto, embora pareça ser capaz de instalar www-data usando o comando mencionado anteriormente, não consigo executar nvm . (O erro é nvm .)

Tentando superar isso, cometi o erro brutal de seguir a sugestão aqui para tentar mudar a versão do nó globalmente (isto é, para todos os usuários) enquanto logado como (eu acho, mas esqueça agora) o nvm not found user (oops!):

// 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

Infelizmente, a execução do comando acima fez com que meu root access fosse interrompido e agora, aparentemente, eu devo reconstruir o servidor a partir do zero.

Minha pergunta é: Como posso instalar e usar sudo como o usuário do Apache ( nvm ) para permitir que um servidor da Web execute um processo Node de uma determinada versão e, assim, controlar qual versão do Node o servidor da web acessos - com a conveniência de usar www-data ?

    
por Dan Nissenbaum 22.01.2017 / 08:58

1 resposta

2

Resposta curta: você não pode.

O NVM é um script de shell que apenas define variáveis de ambiente (modificando principalmente o seu PATH) para alterar a versão node ativa. Como tal, eles não são persistentes além do tempo de vida ou da árvore de processos do shell de chamada.

Embora seja possível executar seu servidor da Web com variáveis de ambiente específicas, não é possível usar o NVM para gerenciá-los, pois qualquer chamada para nvm seria chamada em um subprocesso do servidor da Web e descartada assim que o comando termina.

    
por 23.01.2017 / 00:29