wiki/HowtoNodeJS.md

154 lines
4.4 KiB
Markdown
Raw Normal View History

2017-02-17 15:58:58 +01:00
---
categories: web
title: Howto NodeJS
...
2016-12-29 11:25:39 +01:00
2018-02-20 21:21:31 +01:00
* Documentation : <https://nodejs.org/dist/latest-v8.x/docs/api/>
2018-01-18 18:28:55 +01:00
* Rôle Ansible : <https://forge.evolix.org/projects/ansible-roles/repository/show/nodejs>
2016-12-29 11:25:39 +01:00
2018-02-23 01:49:35 +01:00
[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).
2016-12-29 11:25:39 +01:00
2017-02-17 15:58:58 +01:00
## Installation
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)
2016-12-29 11:25:39 +01:00
~~~
2018-02-23 01:49:35 +01:00
# echo "deb http://deb.nodesource.com/node_8.x stretch main" >> /etc/apt/sources.list.d/nodesource.list
2018-02-20 21:21:31 +01:00
# wget https://deb.nodesource.com/gpgkey/nodesource.gpg.key -O - | apt-key add -
2016-12-29 11:25:39 +01:00
# apt update
2017-02-17 15:58:58 +01:00
# apt install nodejs
2018-01-18 18:28:55 +01:00
$ nodejs -v
v8.9.4
2016-12-29 11:25:39 +01:00
~~~
2018-02-23 01:49:35 +01:00
### Version 9.x (non-LTS)
Pour avoir Node.js 9.X on utilisera les paquets suivants (mais nous déconseillons d'utiliser cela en production) :
~~~
# echo "deb http://deb.nodesource.com/node_9.x stretch main" >> /etc/apt/sources.list.d/nodesource.list
~~~
## Modules npm
2017-11-10 11:04:51 +01:00
2018-02-23 01:49:35 +01:00
### Utilisateur
2017-02-17 15:58:58 +01:00
2018-02-23 01:51:08 +01:00
En tant qu'utilisateur, on peut installer des modules **npm**, par exemple :
2016-12-29 11:25:39 +01:00
~~~
$ npm version
2018-01-18 18:28:55 +01:00
{ npm: '5.6.0',
2016-12-29 11:25:39 +01:00
ares: '1.10.1-DEV',
2018-01-18 18:28:55 +01:00
cldr: '31.0.1',
2017-02-17 15:58:58 +01:00
http_parser: '2.7.0',
2018-01-18 18:28:55 +01:00
icu: '59.1',
modules: '57',
nghttp2: '1.25.0',
node: '8.9.4',
openssl: '1.0.2n',
tz: '2017b',
unicode: '9.0',
uv: '1.15.0',
v8: '6.1.534.50',
zlib: '1.2.11' }
2016-12-29 11:25:39 +01:00
$ npm install ping
2018-02-23 01:49:35 +01:00
/home/jdoe
2018-01-18 18:28:55 +01:00
└─┬ ping@0.2.2
├── q@1.5.1
└── underscore@1.8.3
2016-12-29 11:25:39 +01:00
$ npm list
2018-02-23 01:49:35 +01:00
/home/jdoe└─┬ ping@0.2.2
2018-01-18 18:28:55 +01:00
├── q@1.5.1
└── underscore@1.8.3
2018-01-25 14:08:06 +01:00
~~~
2016-12-29 11:25:39 +01:00
2018-02-23 01:49:35 +01:00
### Global
2018-02-20 21:21:31 +01:00
Certains modules peuvent aussi être installés de manière globale.
Et ainsi rendre la commande disponible via /usr/bin/<nom_module> et les bibliothèques dans `/usr/lib/node_modules`.
2016-12-29 11:25:39 +01:00
~~~
2018-02-23 01:49:35 +01:00
# npm install -g npm
# chown -R root: /usr/lib/node_modules
# chmod -R 755 /usr/lib/node_modules
2018-01-18 18:28:55 +01:00
~~~
2018-02-20 21:21:31 +01:00
2018-02-23 01:49:35 +01:00
### systemd
On peut activer une unité [systemd](HowtoSystemd) pour faire tourner un service en Node.js.
2018-02-23 01:51:08 +01:00
Par exemple, via `/etc/systemd/system/jdoe.js.service` :
2018-02-23 01:49:35 +01:00
~~~
[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
2018-02-23 11:15:38 +01:00
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.
2018-02-23 01:49:35 +01:00
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
2018-02-20 21:21:31 +01:00
~~~
$ npm run dev
[…]
sh: 1: node_modules/cross-env/dist/bin/cross-env.js: Permission denied
[…]
~~~
2018-02-23 01:49:35 +01:00
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**.