From 442181ec7e682a399a5c903ff29b69156cca4ae8 Mon Sep 17 00:00:00 2001 From: gcolpart Date: Fri, 23 Feb 2018 01:49:35 +0100 Subject: [PATCH] relecture --- HowtoNodeJS.md | 105 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 88 insertions(+), 17 deletions(-) diff --git a/HowtoNodeJS.md b/HowtoNodeJS.md index 0776f751..cd5aaea8 100644 --- a/HowtoNodeJS.md +++ b/HowtoNodeJS.md @@ -6,17 +6,14 @@ title: Howto NodeJS * Documentation : * Rôle Ansible : -[NodeJS](https://nodejs.org/) est une implémentation cote serveur du langage Javascript. +[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). ## Installation -Nodejs est disponible en version 4.x sur Debian Stretch. Mais son cycle de maintenance par développeurs se termine en Avril 2018. -Sur Debian Jessie, c'est la version 0.10.X qui est présente mais elle est déprécié par l'upstream… - -Pour installer une version plus récente (ex: 8.x LTS), on peut utiliser les dépôts de nodesource. Ainsi, pour Debian Stretch : +Nous préconisons l'installation des paquets Debian distribués par NodeSource (version 8.x LTS) : ~~~ -# echo "deb http://deb.nodesource.com/node_8.x stretch main" > /etc/apt/sources.list.d/nodesource.list +# echo "deb http://deb.nodesource.com/node_8.x stretch main" >> /etc/apt/sources.list.d/nodesource.list # wget https://deb.nodesource.com/gpgkey/nodesource.gpg.key -O - | apt-key add - # apt update # apt install nodejs @@ -25,11 +22,19 @@ $ nodejs -v v8.9.4 ~~~ -Il est également possible d'installer la version 9 en remplaçant la fin de l'URL du dépôt par `node_9.x`. Mais la branche 9.x ne n'aura pas de support sur le long terme. +### Version 9.x (non-LTS) -## Utilisation de module NPM +Pour avoir Node.js 9.X on utilisera les paquets suivants (mais nous déconseillons d'utiliser cela en production) : -On peut ensuite installer des packages npm en tant qu'utilisateur : +~~~ +# echo "deb http://deb.nodesource.com/node_9.x stretch main" >> /etc/apt/sources.list.d/nodesource.list +~~~ + +## Modules npm + +### Utilisateur + +En tant qu'utilisateur, on peut installer des modules **npm**, par exemple ~~~ $ npm version @@ -49,28 +54,94 @@ $ npm version zlib: '1.2.11' } $ npm install ping -/home/foo +/home/jdoe └─┬ ping@0.2.2 ├── q@1.5.1 └── underscore@1.8.3 $ npm list -/home/foo -└─┬ ping@0.2.2 +/home/jdoe└─┬ ping@0.2.2 ├── q@1.5.1 └── underscore@1.8.3 ~~~ +### Global + Certains modules peuvent aussi être installés de manière globale. Et ainsi rendre la commande disponible via /usr/bin/ et les bibliothèques dans `/usr/lib/node_modules`. ~~~ -npm install -g npm -chown -R root: /usr/lib/node_modules -chmod -R 755 /usr/lib/node_modules +# npm install -g npm +# chown -R root: /usr/lib/node_modules +# chmod -R 755 /usr/lib/node_modules ~~~ -## Problèmes courants +### systemd + +On peut activer une unité [systemd](HowtoSystemd) pour faire tourner un service en Node.js. + +Par exemple, via `/etc/systemd/system/foo.js.service` : + +~~~ +[Unit] +Description=Example.com +[Service] +WorkingDirectory=/home/jdoe/www +ExecStart=/home/jdoe/www/start +Restart=always +StandardOutput=/home/jdoe/log/nodejs-access.log +StandardError=/home/jdoe/log/nodejs-error.log +SyslogIdentifier=example.com +User=jdoe +Group=jdoe +# Allow many incoming connections +LimitNOFILE=infinity + +# Allow core dumps for debugging +LimitCORE=infinity + +[Install] +WantedBy=multi-user.target +~~~ + +## proxy HTTP + +Si l'application Node.js tourne sur le port 4000, voici la configuration standard pour Nginx : + +~~~ +location / { + proxy_pass http://127.0.0.1:4000; + 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; +} +~~~ + +## Websocket + +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 recevoir des informations du serveur. Cela se fait souvent 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) : + +~~~ +# a2enmod proxy_wstunnel +~~~ + +avec une configuration du type : + +~~~ +RewriteCond %{REQUEST_URI} ^/socket.io [NC] +RewriteCond %{QUERY_STRING} transport=websocket [NC] +RewriteRule /(.*) ws://127.0.0.1:4000/$1 [P,L] +ProxyPass / http://127.0.0.1:4000/ +ProxyPassReverse / http://127.0.0.1:4000/ +~~~ + + +## FAQ + +### Permission denied ~~~ $ npm run dev @@ -79,4 +150,4 @@ sh: 1: node_modules/cross-env/dist/bin/cross-env.js: Permission denied […] ~~~ -Lorsque "npm" lève une erreur "Permission denied" alors que tout semble exister avec les bons droits, il faut vérifier que la partition courant ne soit pas montée en "noexec". +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**.