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 :
- pm2 ;
- StrongLoop ;
- Forever.
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 3000 de NodeJS, pensez à faire une exception dans votre pare-feu ou utiliser nginx en reverse proxy avec NodeJS.
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