NodeJS en production sous Linux avec ExpressJS (ou autre)

Mettre NodeJS en production sous Linux est plutôt facile avec systemd ou un autre démon gestionnaire de processus. Dans l’idée nous allons télécharger la dernière version de NodeJS (sans passer par les dépôts officiels) puis configurer un nouveau service pour lancer NodeJS de la bonne manière.

À noter qu’il existe également des gestionnaire de processus conçus spécialement pour lancer des applications NodeJS encore plus simplement, en voici quelques uns :

Téléchargement et installation de NodeJS

Télécharger la version en cours de NodeJS, ici la version 12.13.

$ wget https://nodejs.org/dist/v12.13.0/node-v12.13.0-linux-x64.tar.xz

Décompresser le fichier .tar.xz dans la zone /usr/local pour bénéficier de l’appel aux commandes node et npm sans avoir à changer le $PATH.

# tar --strip-components 1 -xf node-v12.13.0-linux-x64.tar.xz -C /usr/local
$ node -v
v12.13.0

Création d’un service pour lancer NodeJS au démarrage

Comme vu en introduction, vous avez deux solutions pour mettre votre application NodeJS en production.

  • Passer par systemd, natif sous Linux ;
  • Utiliser un paquet de déploiement type pm2.

Le choix de l’une des options se fera suivant votre affinité avec Linux, pour ma part j’ai préféré ne pas installer de paquet supplémentaire sur mon serveur de production.

Afin de passer NodeJS en production avec ExpressJS, je me suis inspiré de ce guide : http://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production qui contient quelques bonnes pratiques, je vous incite à y jeter un œil, ne serait-ce que par curiosité.

Créer un nouveau service systemd pour NodeJS

J’ai décidé de mettre mon application Node directement dans le dossier utilisateur pour ne pas avoir de problèmes de droits.

# adduser nodejs

# su nodejs && cd ~

J’utilise git pour importer mes sources simplement.

$ git clone https://dinath@***/dinath/slowinkillerweb.git

Si jamais vous avez des problèmes de droits (ce qui ne devrait pas arriver ici).

# chown -R nodejs:nodejs /home/nodejs

Voici mon fichier de configuration systemd.

# vi /etc/systemd/system/nodejs-slowin-killer.service

[Unit]
Description=Slowin' Killer Service with NodeJS
After=network.target
Environment=NODE_ENV=production

[Service]
Environment=PORT=3000
Type=simple
User=nodejs
ExecStart=/usr/local/bin/node /home/nodejs/slowinkillerweb/app.js
Restart=on-abort

[Install]
WantedBy=multi-user.target

Attention à bien spécifier le chemin absolu vers votre binaire Node (/usr/local/bin/node).

On prévient systemd que nous venons de modifier un service :

# systemctl daemon-reload

Et il n’y a plus qu’à lancer notre application NodeJS.

# systemctl start nodejs-slowin-killer

Pour vérifier si tout s’est bien déroulé :

# systemctl status nodejs-slowin-killer -l
● nodejs-slowin-killer.service - Slowin' Killer Service with NodeJS
Loaded: loaded (/etc/systemd/system/nodejs-slowin-killer.service; disabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/nodejs-slowin-killer.service.d
└─override.conf
Active: active (running) since ven. 2019-11-01 16:11:13 CET; 1 day 18h ago
Main PID: 1113 (node)
CGroup: /system.slice/nodejs-slowin-killer.service
└─1113 /usr/local/bin/node /home/nodejs/slowinkillerweb/app.js

Vous venez de mettre votre application NodeJS en production ! Si jamais vous souhaitez exposer le port de NodeJS, pensez à faire une exception dans votre pare-feu.

Commandes utiles

Installer uniquement les dépendances nécessaires.

$ npm install --only=prod

Vérifier que son application tourne bien en local.

$ curl localhost:3000

Vérifier que NodeJS écoute bien sur le port 3000.

# netstat -tan | grep 3000

Si jamais NodeJS refuse de se lancer car les limites inotify sont trop basses.

# echo fs.inotify.max_user_watches=582222 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.