Installer Node.js sur Linux (Ubuntu, Debian, AlmaLinux)

Tutoriels Linux › Serveurs web

Documentation / Tutoriels Linux / Serveurs web / Installer Node.js sur Linux (Ubuntu, Debian, AlmaLinux)
Mis à jour le 08/10/2026
843 vues
Intermédiaire
20 minutes

Prérequis

Votre serveur :

Node.js exécute du JavaScript côté serveur. Ce guide installe Node.js 24 (la version LTS), crée une petite application de test, la fait tourner en permanence avec PM2, puis la place derrière Nginx. Choisissez votre système ci-dessus. Copiez la commande avec le bouton Copier, collez-la dans votre terminal, et comparez avec le résultat attendu.

1Mettre à jour le système et installer Node.js 24

Mettez le système à jour d'abord : une ou deux minutes.

Mettre à jour le système
apt update && apt upgrade -y
Résultat attendu
...
212 upgraded, 8 newly installed, 0 to remove and 4 not upgraded.
(les nombres dépendent de l'âge de l'image)
Mettre à jour le système
dnf upgrade -y
Résultat attendu
...
Complete!
Mettre à jour le système
dnf upgrade -y
Résultat attendu
...
Complete!
Mettre à jour le système, puis redémarrer
apk update && apk upgrade && reboot
Résultat attendu
...
OK: 158 MiB in 209 packages
(les nombres dépendent de l'image ; la connexion SSH se coupe au redémarrage)

Alpine redémarre après la mise à jour : quand elle remplace le noyau, les modules du noyau en cours disparaissent et le pare-feu de l'étape 5 ne peut plus se charger (« Couldn't determine iptables version »). Reconnectez-vous en SSH après une minute.

Mettre à jour le système
zypper -n refresh && zypper -n update
Résultat attendu
All repositories have been refreshed.
...

Le dépôt NodeSource fournit la version LTS à jour, que les dépôts du système n'ont pas.

Le dépôt NodeSource fournit la version LTS à jour, que les dépôts du système n'ont pas.

Le dépôt NodeSource fournit la version LTS à jour, que les dépôts du système n'ont pas.

Ajouter le dépôt NodeSource
curl -fsSL https://deb.nodesource.com/setup_24.x | bash -
Résultat attendu
... Repository configured successfully.
... To install Node.js, run: apt install nodejs -y
Ajouter le dépôt NodeSource
curl -fsSL https://rpm.nodesource.com/setup_24.x | bash -
Résultat attendu
... Repository is configured and updated.
... Run 'dnf install nodejs -y' to complete the installation.
Ajouter le dépôt NodeSource
curl -fsSL https://rpm.nodesource.com/setup_24.x | bash -
Résultat attendu
... Repository is configured and updated.
... Run 'dnf install nodejs -y' to complete the installation.
Installer Node.js et npm
apt install -y nodejs
Installer Node.js et npm
dnf install -y nodejs
Installer Node.js et npm
dnf install -y nodejs
Installer Node.js et npm
apk add nodejs npm
Installer Node.js et npm
zypper -n install nodejs24 npm24
Vérifier les versions installées
node -v && npm -v
Résultat attendu
v24.21.0
11.19.0
(les numéros exacts changent avec les mises à jour : l'important est le 24 en tête)

2Créer une application de test

Une application Express minimale, dans /var/www/monapp, qui répond en JSON sur le port 3000. Elle servira à vérifier chaque étape suivante.

Créer le dossier et installer Express
mkdir -p /var/www/monapp && cd /var/www/monapp
npm init -y
npm install express
Résultat attendu
... found 0 vulnerabilities
(la ligne -added N packages- juste avant varie selon la version)
Créer le fichier app.js
cat > /var/www/monapp/app.js << 'EOF'
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;

app.get('/', (req, res) => {
    res.json({ message: 'Bienvenue sur mon API Node.js!', timestamp: new Date().toISOString() });
});

app.get('/health', (req, res) => {
    res.json({ status: 'OK' });
});

app.listen(PORT, () => {
    console.log('Serveur démarré sur le port ' + PORT);
});
EOF

3Faire tourner l'application avec PM2

PM2 garde l'application en vie : il la relance si elle plante et la redémarre avec le serveur. Sans lui, l'application s'arrête dès que vous fermez la session SSH.

Installer PM2
npm install -g pm2
Démarrer l'application
cd /var/www/monapp && pm2 start app.js --name monapp
Résultat attendu
Un tableau PM2 avec une ligne monapp, colonne status : online
Redémarrage automatique avec le serveur
pm2 save && pm2 startup
Résultat attendu
[PM2] Successfully saved in /root/.pm2/dump.pm2
[PM2] Init System found: systemd (ou openrc sur Alpine)
... (pm2 startup installe le service et l'affiche)
Tester l'application
curl http://127.0.0.1:3000/
Résultat attendu
{"message":"Bienvenue sur mon API Node.js!","timestamp":"2026-09-14T22:22:20.571Z"}

4Les commandes PM2 du quotidien

Voir l'état de toutes les applications
pm2 list
Suivre les journaux en direct (Ctrl+C pour sortir)
pm2 logs monapp
Relancer après une modification du code
pm2 restart monapp
Relancer sans coupure (mode cluster)
pm2 reload monapp
Arrêter l'application
pm2 stop monapp
Retirer l'application de la liste
pm2 delete monapp

Pour utiliser tous les processeurs du serveur, PM2 peut lancer une instance par cœur (mode cluster). Le fichier ci-dessous remplace la commande pm2 start.

Fichier ecosystem.config.js (mode cluster)
cat > /var/www/monapp/ecosystem.config.js << 'EOF'
module.exports = {
  apps: [{
    name: 'monapp',
    script: 'app.js',
    instances: 'max',
    exec_mode: 'cluster',
    env_production: { NODE_ENV: 'production', PORT: 3000 },
    max_memory_restart: '500M'
  }]
};
EOF
cd /var/www/monapp && pm2 delete monapp; pm2 start ecosystem.config.js --env production && pm2 save
Résultat attendu
pm2 list affiche autant de lignes monapp que le serveur a de cœurs, toutes en ligne

5Mettre Nginx devant l'application (port 80)

Nginx reçoit les visiteurs sur le port 80 et les transmet à l'application sur le port 3000. Remplacez monapp.exemple.ca par votre nom de domaine.

Installer et démarrer Nginx
apt install -y nginx && systemctl enable --now nginx
Installer et démarrer Nginx
dnf install -y nginx && systemctl enable --now nginx
Installer et démarrer Nginx
dnf install -y nginx && systemctl enable --now nginx
Installer et démarrer Nginx
apk add nginx && rc-update add nginx default && rc-service nginx start
Installer et démarrer Nginx
zypper -n install nginx && systemctl enable --now nginx
Ubuntu / DebianCréer le site Nginx
cat > /etc/nginx/sites-available/monapp << 'EOF'
server {
    listen 80;
    server_name monapp.exemple.ca;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}
EOF
ln -sf /etc/nginx/sites-available/monapp /etc/nginx/sites-enabled/monapp
rm -f /etc/nginx/sites-enabled/default
AlmaLinux / Rocky / CentOSCréer le site Nginx
cat > /etc/nginx/conf.d/monapp.conf << 'EOF'
server {
    listen 80;
    server_name monapp.exemple.ca;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}
EOF
FedoraCréer le site Nginx
cat > /etc/nginx/conf.d/monapp.conf << 'EOF'
server {
    listen 80;
    server_name monapp.exemple.ca;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}
EOF
AlpineCréer le site Nginx
cat > /etc/nginx/http.d/monapp.conf << 'EOF'
server {
    listen 80;
    server_name monapp.exemple.ca;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}
EOF
rm -f /etc/nginx/http.d/default.conf
openSUSECréer le site Nginx
cat > /etc/nginx/vhosts.d/monapp.conf << 'EOF'
server {
    listen 80;
    server_name monapp.exemple.ca;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}
EOF
Autoriser Nginx à joindre l'application (SELinux)
setsebool -P httpd_can_network_connect 1
Autoriser Nginx à joindre l'application (SELinux)
setsebool -P httpd_can_network_connect 1
Activer le pare-feu (SSH reste autorisé) et ouvrir HTTP et HTTPS
apt install -y ufw && ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw --force enable
Résultat attendu
...
Firewall is active and enabled on system startup
Activer le pare-feu (SSH reste autorisé) et ouvrir HTTP et HTTPS
dnf install -y firewalld && systemctl enable --now firewalld && firewall-cmd --permanent --add-service=http --add-service=https && firewall-cmd --reload
Résultat attendu
...
success
success
Activer le pare-feu (SSH reste autorisé) et ouvrir HTTP et HTTPS
dnf install -y firewalld && systemctl enable --now firewalld && firewall-cmd --permanent --add-service=http --add-service=https && firewall-cmd --reload
Résultat attendu
...
success
success
Activer le pare-feu (SSH reste autorisé) et ouvrir HTTP et HTTPS
apk add ufw && ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw --force enable && rc-update add ufw default
Résultat attendu
...
Firewall is active and enabled on system startup
 * service ufw added to runlevel default
Activer le pare-feu (SSH reste autorisé) et ouvrir HTTP et HTTPS
systemctl enable --now firewalld && firewall-cmd --permanent --add-service=http --add-service=https && firewall-cmd --reload
Résultat attendu
success
success
Vérifier la configuration et recharger Nginx
nginx -t && systemctl reload nginx
Résultat attendu
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Vérifier la configuration et recharger Nginx
nginx -t && systemctl reload nginx
Résultat attendu
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Vérifier la configuration et recharger Nginx
nginx -t && systemctl reload nginx
Résultat attendu
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Vérifier la configuration et recharger Nginx
nginx -t && rc-service nginx reload
Résultat attendu
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
 * Reloading nginx configuration ... [ ok ]
Vérifier la configuration et recharger Nginx
nginx -t && systemctl reload nginx
Résultat attendu
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Tester par le port 80
curl -H 'Host: monapp.exemple.ca' http://127.0.0.1/
Résultat attendu
{"message":"Bienvenue sur mon API Node.js!","timestamp":"..."}

6Activer HTTPS avec Let's Encrypt

À faire une fois que votre nom de domaine pointe vers l'adresse IP du serveur. Certbot obtient le certificat et modifie le site Nginx pour servir en HTTPS.

Installer Certbot
apt install -y certbot python3-certbot-nginx
Installer Certbot (dépôt EPEL)
dnf install -y epel-release && dnf install -y certbot python3-certbot-nginx
Installer Certbot
dnf install -y certbot python3-certbot-nginx python3-pyparsing
Installer Certbot
apk add certbot certbot-nginx
Installer Certbot
zypper -n install python313-certbot-nginx
Demander le certificat
certbot --nginx -d monapp.exemple.ca

7Garder la configuration dans un fichier .env

Le port, les accès à une base de données ou une clé secrète n'ont rien à faire dans le code. Le paquet dotenv les lit dans un fichier .env au démarrage.

Créer le fichier .env et installer dotenv
cd /var/www/monapp
cat > .env << 'EOF'
NODE_ENV=production
PORT=3000
EOF
npm install dotenv
Charger le fichier au début de app.js (première ligne)
require('dotenv').config();
Vérifier que la variable est lue
cd /var/www/monapp && node -e "require('dotenv').config(); console.log('PORT lu =', process.env.PORT)"
Résultat attendu
PORT lu = 3000

Autre façon d'installer : NVM

NVM installe Node.js dans le dossier de l'utilisateur et permet de changer de version sans toucher au système. Pratique pour un poste de développement, moins pour un serveur de production.

Installer NVM puis Node.js 24
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
source ~/.bashrc
nvm install 24 && nvm use 24 && nvm alias default 24
node -v
Node.js en production

Votre application tourne avec PM2, redémarre toute seule et répond derrière Nginx. Pour aller plus loin : une base de données MongoDB ou PostgreSQL, et un déploiement automatique depuis Git.

Erreurs fréquentes

💬 Écrivez-nous sur Messenger !