¿Cómo utilizar NVM para cambiar las versiones de Nodo para el usuario de Apache ("www-data"), un usuario con una funcionalidad muy limitada?

¿Cómo utilizar NVM para cambiar las versiones de Nodo para el usuario de Apache ("www-data"), un usuario con una funcionalidad muy limitada?

Llamo a un script de Nodo desde PHP en mi servidor web Ubuntu, como en

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

Como se señaló, el código PHP se ejecuta en el contexto del usuario de Apache, que es www-datael predeterminado en Ubuntu.

Me gustaría poder utilizar nvmpara cambiar las versiones de Nodo para elwww-datausuario.

(Nota: es posible que pueda cambiar las versiones de Nodesinusando nvmespecificando la ruta completa a una instalación de Nodo diferente; no lo he probado todavía, pero no es mi pregunta).

Siguiendo instruccionesaquí, lo instalo y uso nvmcon bastante facilidad paraotrousuarios:

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

y

nvm install 4.1.2

Descubrí que debo instalarlo nvmpor separado para cada usuario. Esto significa que nvmno se instala para el www-datausuario cuando ejecuto el comando anterior como usuario de inicio de sesión ( ubuntu); y, a la inversa, cambiar mi versión de Nodo para el usuario que inicia sesión ( ubuntu) no tiene ningún efecto en el www-datausuario.

Un detalle más importante: el www-datausuario es especial. Este usuario tiene una funcionalidad muy restringida. Para cambiar al www-datausuario en el shell, se requiere este comando especial:

sudo su www-data -s /bin/sh 

(...E incluso el comando anterior no funcionará sin otros pasos especiales previos, que no se mencionan aquí, para permitir un indicador de shell para el www-datausuario).

Sin embargo, cuando inicio sesión como www-datausuario, aunque parece que puedoinstalar nvmusando el comando mencionado anteriormente, no puedocorrer nvm. (El error es nvm not found.)

Al intentar superar esto, cometí el brutal error de seguir la sugerenciaaquípara intentar cambiar la versión del Nodo globalmente (es decir, para todos los usuarios) mientras está conectado como (creo, pero lo olvido ahora) el rootusuario (¡ups!):

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

Desafortunadamente, ejecutar el comando anterior provocó que mi sudoacceso se interrumpiera y ahora aparentemente debo reconstruir el servidor desde cero.

Mi pregunta es: ¿Cómo puedo instalar y utilizar nvmcomo usuario de Apache ( www-data) para permitir que un servidor web ejecute un proceso de Nodo de una versión determinada y, por lo tanto, controlar a qué versión de Nodo accede el servidor web, con la comodidad de usar nvm?

Respuesta1

Respuesta corta: no puedes.

NVM es un script de shell que solo establece variables de entorno (principalmente modificando su RUTA) para cambiar la nodeversión activa. Como tales, no son persistentes más allá de la vida útil o del árbol de procesos del shell que realiza la llamada.

Si bien debería poder ejecutar su servidor web con variables de entorno particulares, no puede usar NVM para administrarlas, ya que cualquier llamada a nvmse llamaría en un subproceso de su servidor web y se descartaría tan pronto como finalice el comando.

información relacionada