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.