Table des matières

Guide de déploiement — Application Node.js sur Windows Server + IIS

Cas d'usage : petite application de questionnaires (trafic léger)

IIS reste le serveur web exposé publiquement (port 80/443) et agit comme reverse proxy vers l'application Node.js, qui tourne en arrière-plan comme service Windows (géré par NSSM) sur un port local. C'est l'approche à privilégier aujourd'hui pour un déploiement durable.


1. Objectif et architecture

Ce document décrit, pas à pas, comment déployer une application Node.js sur un Windows Server existant, en utilisant IIS comme point d'entrée public. Il est pensé pour une application à faible trafic (formulaires / réponses à des questionnaires), mais les étapes restent valables pour la plupart des applications Node.js classiques (Express, Fastify, etc.).

IIS n'exécute pas directement le code Node — il transmet les requêtes à l'application Node via un reverse proxy. L'application, elle, tourne en permanence en arrière-plan sur un port local (ex. 3000), démarrée et surveillée par NSSM en tant que service Windows.

Schéma : Internet → IIS (port 443, certificat SSL) → module URL Rewrite + ARR → Node.js (127.0.0.1:3000, exécuté par NSSM en tant que service Windows).

2. Prérequis

3. Étape 1 — Installer le rôle IIS

Si IIS n'est pas encore installé sur le serveur :

# PowerShell, en tant qu'administrateur
Install-WindowsFeature -Name Web-Server -IncludeManagementTools

Ou via l'interface graphique : Gestionnaire de serveur → Ajouter des rôles et fonctionnalités → Serveur Web (IIS) → cocher au minimum : Contenu statique, Document par défaut, Journalisation HTTP, Filtrage des requêtes, Console de gestion IIS.

4. Étape 2 — Installer Node.js

node -v
npm -v

Les deux commandes doivent afficher un numéro de version sans erreur.

5. Étape 3 — Installer les modules IIS nécessaires

5.1 URL Rewrite Module

Indispensable pour rediriger les requêtes entrantes vers l'application Node. Télécharger et installer « URL Rewrite Module 2.1 » depuis le site officiel IIS (iis.net/downloads/microsoft/url-rewrite).

5.2 Application Request Routing (ARR)

Nécessaire pour que IIS agisse comme reverse proxy vers un port local. Télécharger et installer « Application Request Routing 3.0 » depuis le même site (iis.net/downloads/microsoft/application-request-routing).

Après installation d'ARR, ouvrir IIS Manager → sélectionner le nœud du serveur (racine) → double-cliquer sur « Application Request Routing Cache » → dans le panneau Actions à droite, cliquer sur « Server Proxy Settings » → cocher « Enable proxy » → Appliquer.

Redémarrage : un redémarrage du service IIS (ou du serveur) est recommandé après l'installation des deux modules : iisreset en ligne de commande administrateur.

6. Étape 4 — Préparer l'application Node.js

cd D:\Apps\questionnaire-app
npm ci --omit=dev
// server.js
const PORT = process.env.PORT || 3000;
app.listen(PORT, "127.0.0.1", () => {
  console.log(`App started on 127.0.0.1:${PORT}`);
});
node server.js
# puis, dans un autre terminal :
curl http://127.0.0.1:3000

7. Étape 5 — Exécuter Node.js comme service Windows (NSSM)

Sans cette étape, l'application s'arrête dès que la session qui l'a lancée se ferme, et ne redémarre pas après un reboot du serveur. NSSM (Non-Sucking Service Manager) résout ce problème simplement.

cd C:\Tools\nssm
nssm install QuestionnaireApp

Une fenêtre NSSM s'ouvre. Renseigner :

Dans l'onglet « I/O », rediriger la sortie standard et les erreurs vers des fichiers de log (ex. D:\Apps\questionnaire-app\logs\out.log et err.log) pour faciliter le diagnostic.

Dans l'onglet « Exit actions », choisir « Restart application » en cas d'arrêt inattendu.

Démarrer et vérifier le service :

nssm start QuestionnaireApp
Get-Service QuestionnaireApp
curl http://127.0.0.1:3000

8. Étape 6 — Configurer IIS comme reverse proxy

Créer un fichier web.config à la racine du dossier qui sera utilisé comme racine du site IIS (peut être un dossier vide dédié, distinct du code Node, ex. D:\Sites\questionnaire\) :

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="ReverseProxyToNode" stopProcessing="true">
          <match url="(.*)" />
          <action type="Rewrite"
                  url="http://127.0.0.1:3000/{R:1}" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Ce fichier indique à IIS (via URL Rewrite + ARR) de transmettre toutes les requêtes reçues vers l'application Node en écoute sur le port local 3000.

9. Étape 7 — Créer le site dans IIS Manager

  1. Ouvrir IIS Manager → clic droit sur « Sites » → Ajouter un site web.
  2. Nom du site : ex. QuestionnaireApp.
  3. Chemin d'accès physique : D:\Sites\questionnaire\ (le dossier contenant le web.config créé à l'étape précédente).
  4. Liaison (Binding) : type http, port 80 (et https / port 443 une fois le certificat installé, voir étape suivante), nom d'hôte = le domaine/sous-domaine prévu.
  5. Pool d'applications : créer ou assigner un pool dédié, en mode « No Managed Code » (Node gère son propre runtime, IIS n'a pas besoin du pipeline .NET).
  6. Démarrer le site.

10. Étape 8 — Configurer HTTPS

Fortement recommandé dès que le questionnaire transmet des données, même peu sensibles.

<rule name="ForceHTTPS" stopProcessing="true">
  <match url="(.*)" />
  <conditions>
    <add input="{HTTPS}" pattern="off" />
  </conditions>
  <action type="Redirect"
          url="https://{HTTP_HOST}/{R:1}"
          redirectType="Permanent" />
</rule>

Cette règle doit être placée avant la règle ReverseProxyToNode dans le web.config.

11. Étape 9 — Pare-feu Windows

Autoriser uniquement les ports nécessaires en entrée : 80 et 443 pour IIS. Le port 3000 (Node) ne doit pas être ouvert à l'extérieur — il ne doit rester accessible qu'en local puisque Node écoute sur 127.0.0.1.

New-NetFirewallRule -DisplayName "IIS HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
New-NetFirewallRule -DisplayName "IIS HTTPS" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow

12. Étape 10 — Tester le déploiement

  1. Depuis le serveur : curl http://127.0.0.1:3000 doit répondre (Node direct).
  2. Depuis le serveur : curl http://localhost/ doit répondre la même chose (via IIS + reverse proxy).
  3. Depuis un poste client : accéder à http://nom-du-site puis https://nom-du-site dans un navigateur.
  4. Vérifier que le formulaire/questionnaire fonctionne de bout en bout (soumission, enregistrement des réponses).
  5. Redémarrer le serveur (ou au moins le service NSSM et IIS) et vérifier que tout redémarre automatiquement sans intervention manuelle.

13. Étape 11 — Sécuriser l'application

Quelques points à vérifier côté code Node, en plus de la configuration IIS/réseau :

14. Étape 12 — Logs et supervision

15. Étape 13 — Procédure de mise à jour de l'application

  1. Récupérer la nouvelle version du code (git pull ou copie de fichiers) dans D:\Apps\questionnaire-app\.
  2. Installer les éventuelles nouvelles dépendances : npm ci –omit=dev.
  3. Arrêter le service : nssm stop QuestionnaireApp.
  4. Redémarrer le service : nssm start QuestionnaireApp.
  5. Vérifier rapidement (étape 10) que le site répond correctement.
Bonnes pratiques : pour limiter les interruptions, prévoir les mises à jour en dehors des heures d'utilisation du questionnaire, et garder une copie de la version précédente pour pouvoir revenir en arrière rapidement en cas de problème.

16. Checklist finale

Élément Statut
Rôle IIS installé
Node.js installé et vérifié (node -v)
URL Rewrite + ARR installés, proxy activé
Application copiée, dépendances installées (npm ci)
Application testée en local sur 127.0.0.1:3000
Service NSSM créé, démarré, redémarrage auto configuré
web.config reverse proxy en place
Site créé dans IIS, binding http configuré
Certificat SSL installé, binding https configuré
Redirection HTTP → HTTPS active
Pare-feu : ports 80/443 ouverts, 3000 fermé en externe
Test de bout en bout du questionnaire réussi
Redémarrage serveur testé (reprise automatique)
Logs NSSM et IIS vérifiés
Sécurité applicative revue (helmet, validation, rate limit)

17. Annexe — Dépannage rapide

Symptôme Piste de résolution
Erreur 502.3 (Bad Gateway) dans IIS Vérifier que le service NSSM tourne (Get-Service QuestionnaireApp) et que curl http://127.0.0.1:3000 répond en local.
Erreur 500.19 sur le site IIS web.config invalide ou module URL Rewrite/ARR non installé — vérifier la syntaxe XML et la présence des modules.
Le site répond en HTTP mais pas en HTTPS Vérifier le binding 443 et que le certificat sélectionné est valide et non expiré.
L'application ne redémarre pas après reboot du serveur Vérifier que le service NSSM est configuré en démarrage automatique (Services.msc → QuestionnaireApp → Type de démarrage = Automatique).
Modifications du code non prises en compte S'assurer d'avoir bien exécuté nssm stop / nssm start après la mise à jour du code (voir étape 13).

Document préparé le 18 août 2026.