[Node.js](https://nodejs.org/) est une implémentation libre en langage Javascript orientée pour les applications réseau événementielles. Node.js intègre une bibliothèque HTTP permettant de faire tourner un serveur web, notamment en utilisant le protocole [WebSocket](https://fr.wikipedia.org/wiki/WebSocket).
Nous préconisons l'installation des paquets Debian distribués par NodeSource (version 8.x LTS) car ceux présent dans Debian Stretch sont assez anciens (Version: 4.x)
[PM2 (Process Manager 2)](https://pm2.io) est un système de gestion de processus en production. Il peut s'assurer du bon fonctionnement du (ou des) processus applicatif, collecter les logs, faire du load balancing, etc...
La version "Runtime" est peut être installée simplement avec npm, ou via un paquet Debian :
Use `pm2 show <id|name>` to get more details about an app
~~~
On peut aussi utiliser un fichier de configuration (ou d'écosystème), qui va permettre d'ajuster certains paramètres comme les variables d'environnement ou la méthode de lancement de l'application. [Plus de détails dans la documentation officielle](https://pm2.io/doc/en/runtime/guide/ecosystem-file/)
Utiliser PM2 avec des comptes utilisateurs applicatifs :
1.*Supprimer/Commenter* la ligne `export PM2_HOME=/etc/pm2` dans */etc/default/pm2* - **Important**, sinon pm2 va s'obstiner a essayer d'utiliser /etc/pm2
2. Utiliser la commande `pm2 startup -u app_user --hp /home/app_user/` pour installer une unité systemd pour la daemon pm2 de l'utilisateur
3. Démarrer pm2 pour l'utilisateur : `systemctl start pm2-app_user.service`
Il est classique qu'une application Node.js utilise le protocole [Websocket](https://fr.wikipedia.org/wiki/WebSocket) qui permet d'ouvrir une sorte de connexion TCP au travers de HTTP pour avoir un canal de communication bidirectionnel et en temps réel avec le serveur. En fonction du module utilisé l'URL de connexion sera différente mais dans le cas du module _socket.io_ cela se fait en utilisant une requête HTTP GET vers une adresse du type _/socket.io/?xxxx_ avec les entêtes _Connection: Upgrade_ et _Upgrade: websocket_ qui va provoquer un code HTTP 101 (Switching Protocol) et l'ouverture d'une websocket.
Si l'on veut proxyfier cela avec Apache, il faut activer le module Apache [mod_proxy_wstunnel](https://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html) :
Lorsque _npm_ lève une erreur _Permission denied_ alors que tout semble exister avec les bons droits, il faut vérifier que la partition courante ne soit pas montée en **noexec**.