Pour exposer une application Node.js en production, on la place derrière un proxy inverse (Nginx) et on la maintient en vie avec un gestionnaire de processus (PM2 ou systemd).
+------------------+
| Utilisateurs |
+---------+--------+
|
v
+---------+-------------+
| Nginx (proxy inverse) |
+---------+-------------+
|
v
+----------------------+
| Node.js (JavaScript)|
| (géré par pm2) |
+----------------------+
1. Installer Node.js
Debian / Ubuntu :
sudo apt update
sudo apt install -y nodejs npm
RHEL / CentOS :
sudo yum update
sudo yum install -y nodejs
Vérifier l'installation :
node -v
npm -v
2. Nginx en proxy inverse
Nginx reçoit les requêtes HTTP (port 80/443) et les redirige vers l'application Node.js qui écoute en local (port 3000).
sudo nano /etc/nginx/sites-available/monapp.com
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
sudo ln -s /etc/nginx/sites-available/monapp.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
3. Une application minimale
/var/www/monapp/app.js en Node.js pur :
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
Ou avec Express, en ajoutant quelques en-têtes de sécurité :
const express = require('express');
const app = express();
app.use((req, res, next) => {
res.setHeader('Cache-Control', 'public');
res.setHeader('Strict-Transport-Security', 'max-age=63072000');
res.setHeader('X-Frame-Options', 'DENY');
next();
});
// vos routes ici
app.listen(3000, () => {
console.log('Serveur démarré sur le port 3000');
});
4. Maintenir l'app en vie
Lancer node app.js à la main n'est pas viable : dès que la session ferme ou que le serveur redémarre, l'app s'arrête. Deux méthodes robustes.
Méthode 1 — PM2
sudo npm install -g pm2
cd /var/www/monapp
pm2 start app.js --name "my-node-app"
pm2 status
pm2 logs my-node-app
Démarrage automatique au boot :
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u votre_utilisateur --hp /home/monapp
pm2 save
Méthode 2 — Service systemd
sudo nano /etc/systemd/system/monapp.service
[Unit]
Description=Mon Application Node.js
After=network.target
[Service]
ExecStart=/usr/bin/node /var/www/monapp/app.js
WorkingDirectory=/var/www/monapp
Restart=always
User=votre_utilisateur
Group=votre_utilisateur
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start monapp
sudo systemctl enable monapp
sudo systemctl status monapp
Avec ce montage Nginx → Node.js → PM2/systemd, votre application redémarre automatiquement en cas de crash ou de redémarrage, et reste accessible sur les ports 80/443 standard.