Offre Durée limitée : -10% sur tout le site* avec le code WELCOME10

Installer et sécuriser Node.js sur un VPS Linux avec NVM

Mis à jour le 29 octobre 2026 9 min de lecture 10 sections

Pourquoi installer Node.js avec NVM sur un VPS

Node.js est un runtime JavaScript côté serveur utilisé pour déployer des API, des applications web, des bots et des outils en ligne de commande sur un serveur Unix/Linux. Sur un VPS Linux, c'est le runtime de choix pour tout ce qui ne tourne pas en PHP ou Python : serveurs WebSocket, backends Next.js ou Nuxt, scripts d'automatisation, bots Discord.

Les dépôts officiels d'Ubuntu et Debian fournissent un package Node.js souvent en retard de plusieurs versions majeures. Sur un système Unix comme Debian 12, le paquet nodejs pointe encore vers Node.js 18, alors que la version la plus récente en LTS est la 26.x. Ce décalage crée deux problèmes pour l'admin d'un VPS : les correctifs de sécurité arrivent avec du retard, et les frameworks récents refusent de démarrer sur un runtime trop ancien.

NVM (Node Version Manager) résout ce problème. C'est un script Bash téléchargé depuis GitHub qui installe Node.js dans le répertoire personnel de l'utilisateur, sans toucher aux paquets système. Chaque version est isolée dans son propre répertoire sous ~/.nvm/versions/node/. Vous pouvez installer plusieurs versions en parallèle et basculer de l'une à l'autre en une commande. Le principe est le même que pyenv pour Python ou phpenv pour PHP : un gestionnaire de versions par utilisateur, indépendant du système.

Ce tutoriel couvre l'installation de NVM, la gestion des versions du runtime Node.js, la configuration de PM2 pour le process management, et les bonnes pratiques de sécurité pour un VPS de production.

L'actualité rappelle l'importance de garder Node.js à jour : le 21 octobre 2026, le projet Node.js a publié des correctifs pour 10 vulnérabilités sur les branches 26.x, 24.x et 22.x, dont CVE-2026-111497 (Node2Shell), une faille critique (CVSS 9.2) dans le décodeur Brotli permettant une exécution de code à distance. Le CISA a ajouté cette CVE à sa liste de vulnérabilités activement exploitées le 27 octobre 2026. Avec NVM, appliquer ce type de correctif prend une seule commande.

Prérequis

  • Un VPS Linux sous Ubuntu 22.04/24.04 LTS ou Debian 12 avec un accès SSH ;
  • Un utilisateur non-root avec sudo (ne jamais exécuter le runtime Node.js en root) ;
  • Les paquets curl (ou wget), build-essential et git installés ;
  • Un accès SSH sécurisé configuré sur le VPS ;
  • Un terminal avec accès en ligne de commande au serveur (toute l'administration se fait en SSH, pas en FTP).

Installez les dépendances de compilation nécessaires à certains packages npm natifs (modules qui contiennent du code C/C++) :

sudo apt update
sudo apt install -y curl build-essential git

Installer NVM

NVM s'installe via un script officiel téléchargé depuis GitHub. La version la plus récente est la v0.40.8 (septembre 2026). Le script crée le répertoire ~/.nvm et ajoute les lignes de chargement à votre fichier de config ~/.bashrc (ou ~/.zshrc si vous utilisez Zsh) :

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

Rechargez votre shell pour activer NVM :

source ~/.bashrc

Vérifiez l'installation depuis la ligne de commande :

nvm --version

La commande doit afficher 0.40.8. Si le terminal répond nvm: command not found, vérifiez que les trois lignes suivantes sont présentes dans votre fichier de config ~/.bashrc :

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

Installer et gérer les versions Node.js

Installez la dernière version LTS du runtime Node.js. Depuis le 28 octobre 2026, la branche 26.x (nom de code Lithium) est la version Active LTS, la branche 24.x (Krypton) passe en Maintenance LTS, et la branche 22.x (Jod) reste en Maintenance LTS :

nvm install --lts

Pour installer une version spécifique :

nvm install 26
nvm install 24
nvm install 22

Listez les versions installées sur votre VPS :

nvm ls

Basculez entre les versions du runtime :

nvm use 26
nvm use 24

Définissez la version par défaut pour chaque nouveau terminal :

nvm alias default 26

Vérifiez la version active et le chemin de l'exécutable :

node --version
which node

Le chemin doit pointer vers ~/.nvm/versions/node/, pas vers /usr/bin/node. Si le chemin pointe vers /usr/bin, c'est le package système qui répond, pas NVM.

Configurer un fichier .nvmrc par projet

Quand plusieurs projets Node.js tournent sur le même VPS, chacun peut nécessiter une version différente du runtime. Le fichier .nvmrc, placé à la racine du répertoire d'un projet, fixe la version de Node.js à utiliser :

cd /home/nodeapp/mon-projet
echo "26" > .nvmrc

Ensuite, un simple nvm use dans ce répertoire lit le fichier de config et bascule vers la bonne version :

cd /home/nodeapp/mon-projet
nvm use

Cette approche simplifie les scripts de déploiement : le script lit le .nvmrc, active la bonne version, puis lance l'application. Elle garantit aussi que chaque admin qui intervient sur le VPS utilise le même runtime, quel que soit son nvm alias default personnel.

Pour les projets utilisant les modules ES (import/export au lieu de require), vérifiez que la version dans le fichier .nvmrc est compatible : les imports ES natifs sont stables à partir de Node.js 16, mais certaines fonctionnalités récentes nécessitent Node.js 24 ou supérieur.

PM2 : gestion des processus et redémarrage automatique

PM2 est le gestionnaire de processus de référence pour les applications Node.js en production. Il maintient vos applications en vie, les redémarre automatiquement en cas de crash ou de redémarrage du VPS, et fournit des logs centralisés. La version actuelle est PM2 7.1.1 (octobre 2026), compatible avec le runtime Node.js 20 et supérieur.

Installez PM2 globalement via npm (le package manager de Node.js) :

npm install -g pm2

Lancez une application Node.js avec PM2 :

pm2 start app.js --name mon-app

PM2 peut aussi lancer des scripts npm définis dans le fichier package.json du projet :

pm2 start npm --name mon-app -- run start

Commandes de supervision courantes :

pm2 list
pm2 logs mon-app
pm2 monit
pm2 restart mon-app
pm2 stop mon-app

Pour que vos applications redémarrent automatiquement après un reboot du VPS (au boot du système), configurez le démarrage automatique de PM2 via systemd :

pm2 startup systemd

Exécutez la commande affichée par PM2 (elle contient le chemin exact vers votre installation Node.js via NVM). Puis sauvegardez la liste des processus actifs :

pm2 save

Après un redémarrage du VPS, PM2 restaurera automatiquement tous les processus sauvegardés. Vous pouvez redémarrer manuellement l'ensemble des processus avec pm2 restart all.

Sécuriser Node.js sur un VPS Linux

Exécuter une application Node.js sur un VPS Unix exposé à Internet demande les mêmes précautions que tout autre service réseau. Voici les bonnes pratiques à appliquer pour un admin de serveur.

Utilisateur dédié sans privilèges root

Créez un utilisateur système dédié à vos applications Node.js. Si le processus est compromis, l'attaquant n'obtient que les droits de cet utilisateur, pas un accès admin root au serveur :

sudo adduser --disabled-password --gecos "" nodeapp
sudo su - nodeapp

Installez NVM et Node.js dans le répertoire personnel de cet utilisateur. L'application tourne avec des droits minimaux, ce qui limite la surface d'attaque.

Reverse proxy : Nginx ou Apache devant Node.js

N'exposez jamais votre application Node.js directement sur le port 80 ou 443. Utilisez un reverse proxy (Nginx ou Apache) devant le runtime Node.js pour gérer le TLS, la compression et le cache statique. Restreignez les ports ouverts avec UFW :

sudo ufw default deny incoming
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Le port sur lequel écoute Node.js (3000, 8080, etc.) ne doit pas être ouvert dans le pare-feu. Seul le reverse proxy y accède en local. Configurez également Fail2ban pour protéger SSH contre les attaques par force brute.

Désactiver les fonctionnalités inutiles

Pour réduire la surface d'attaque, désactivez ce dont votre application n'a pas besoin :

  • Désactivez l'inspecteur de debug (--inspect) en production : un port de debug ouvert permet l'exécution de code à distance ;
  • Désactivez les en-têtes qui révèlent la stack technique (le header X-Powered-By est envoyé par défaut par Express : app.disable('x-powered-by')) ;
  • Limitez le nombre de connexions simultanées avec server.maxConnections ou via la config du reverse proxy.

Variables d'environnement et fichier .env

Stockez les secrets (clés API, identifiants de connexion à votre base de données MySQL ou PostgreSQL, tokens) dans des variables d'environnement ou un fichier .env à la racine du répertoire du projet. Ne versionnez jamais ce fichier dans Git. PM2 peut charger un fichier d'environnement au démarrage :

pm2 start app.js --name mon-app --env production

Restreignez les permissions du fichier .env pour que seul l'utilisateur dédié puisse le lire :

chmod 600 .env

Maintenir Node.js à jour

Garder le runtime Node.js à jour est la mesure de sécurité la plus importante. La release de sécurité d'octobre 2026 illustre le risque : 10 bugs de sécurité corrigés en une seule fois, dont une exécution de code à distance via le décodeur Brotli intégré (CVE-2026-111497, CVSS 9.2). Les versions corrigées sont v26.12.1, v24.22.1 et v22.23.4.

Avec NVM, installer la version la plus récente de votre branche LTS prend deux commandes en ligne de commande :

nvm install 26 --reinstall-packages-from=26
nvm alias default 26

L'option --reinstall-packages-from réinstalle vos packages globaux (PM2, etc.) dans la nouvelle version. Redémarrez ensuite vos applications PM2 :

pm2 restart all

Automatisez la surveillance des nouvelles releases de sécurité en vous abonnant au flux RSS du blog Node.js ou en surveillant la liste de diffusion nodejs-sec. Combinez cette veille avec les mises à jour automatiques du système pour couvrir l'ensemble de la pile logicielle du VPS.

Auditez régulièrement les dépendances npm de vos projets pour détecter les packages vulnérables :

npm audit
npm audit fix

Paquet système vs NVM : tableau comparatif

Critère Paquet système (apt) NVM
Version disponibleDépend de la distribution (souvent Node 18 sur Debian 12)Toutes les versions, de la 4 à la 26
Délai des correctifs de sécuritéSemaines à mois (attente du mainteneur Debian/Ubuntu)Le jour même de la release officielle
Plusieurs versions en parallèleNon (une seule version système)Oui, isolées par répertoire utilisateur
Installation par utilisateurNon (installation système globale, nécessite root)Oui, sans privilège root
Packages globaux npmNécessitent sudo npm install -gSans sudo, dans le répertoire NVM
Basculement entre versionsImpossible sans outils tiersnvm use 24
Config par projet (.nvmrc)Non supportéOui, un fichier .nvmrc par répertoire
Compatibilité PM2 startupOuiOui (chemin NVM dans la commande systemd)

Conclusion

NVM permet d'installer et de gérer le runtime Node.js proprement sur un VPS Linux, sans dépendre du rythme de mise à jour des dépôts système. Combiné à PM2 pour la supervision des processus et aux bonnes pratiques de sécurité (utilisateur dédié, pare-feu restrictif, reverse proxy Apache ou Nginx, désactivation des fonctionnalités inutiles, mises à jour rapides), votre environnement Node.js de production est à la fois fonctionnel et durci. Pour aller plus loin dans la sécurisation de votre serveur, consultez notre tuto sécuriser un VPS Ubuntu avec SSH, UFW et Fail2ban.

FAQ

Peut-on utiliser NVM avec plusieurs utilisateurs sur un même VPS ?

Oui. NVM s'installe dans le répertoire personnel de chaque utilisateur (~/.nvm). Chaque utilisateur gère ses propres versions de Node.js indépendamment, sans interférer avec les autres comptes du serveur. C'est un avantage par rapport au paquet système, qui impose une seule version à tout le serveur.

Quelle version Node.js choisir : LTS ou Current ?

Pour un serveur de production, choisissez toujours la branche Active LTS. Depuis le 28 octobre 2026, c'est Node.js 26.x (Lithium). La branche Current reçoit les nouvelles fonctionnalités en premier, mais n'a pas la même garantie de stabilité. Réservez Current aux environnements de développement et de test.

PM2 est-il obligatoire pour exécuter une application Node.js en production ?

Non, mais fortement recommandé. Sans gestionnaire de processus, une application Node.js qui plante reste arrêtée jusqu'à un redémarrage manuel. PM2 la relance automatiquement, gère les logs, et restaure les processus après un reboot du VPS via systemd. Les alternatives sont forever (plus ancien) ou une unité systemd écrite manuellement.

Comment mettre à jour Node.js installé via NVM ?

Exécutez nvm install 26 --reinstall-packages-from=26 pour installer la dernière version patch de la branche 26.x et migrer vos paquets globaux. Puis redémarrez vos applications avec pm2 restart all. L'ancienne version reste installée et accessible via nvm use jusqu'à ce que vous la supprimiez avec nvm uninstall.

Faut-il un VPS dédié pour exécuter une application Node.js ?

Non. Une application Node.js légère (API, site statique généré, bot Discord) tourne confortablement sur un VPS avec 1 vCPU et 2 Go de RAM. Augmentez les ressources si votre application gère beaucoup de connexions simultanées ou des traitements lourds (rendu côté serveur, compilation, traitement d'images).

Node.js peut-il se connecter à MySQL ou PostgreSQL ?

Oui. Les packages npm mysql2 (pour MySQL/MariaDB) et pg (pour PostgreSQL) sont les drivers les plus utilisés. Stockez les identifiants de connexion dans un fichier .env et non dans le code source. PM2 charge ces variables d'environnement au démarrage de l'application.

Faut-il utiliser Apache ou Nginx comme reverse proxy devant Node.js ?

Les deux fonctionnent. Nginx est plus léger et gère mieux les connexions WebSocket. Apache convient si votre VPS héberge déjà des sites PHP avec mod_php ou si vous utilisez des fichiers .htaccess. Dans les deux cas, Node.js écoute sur un port local (3000, 8080) et le reverse proxy transmet les requêtes.