Login Logout

Howto NodeJS

Node.js 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.

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)

# 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

$ nodejs -v
v8.9.4

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

Utilisateur

En tant qu’utilisateur, on peut installer des modules npm, par exemple :

$ npm version
{ npm: '5.6.0',
  ares: '1.10.1-DEV',
  cldr: '31.0.1',
  http_parser: '2.7.0',
  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' }

$ npm install ping
/home/jdoe
└─┬ ping@0.2.2
  ├── q@1.5.1
  └── underscore@1.8.3

$ npm list
/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

Yarn

Yarn est un gestionnaire de dépendances pour NodeJS : https://yarnpkg.com/fr/ Il utilise le même registre de paquets que NPM mais pas le même mécanisme de résolution de l’arbre des dépendances.

Installation par NPM :

# npm install yarn

Installation via un paquet Debian :

# echo "deb http://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list
# wget -qO - https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
# apt update && apt install yarn

systemd

On peut activer une unité systemd pour faire tourner un service en Node.js.

Par exemple, via /etc/systemd/system/jdoe.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 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 :

# 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
[…]
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 courante ne soit pas montée en noexec.