Comment configurer une application Node.js pour la production sur Debian 8

introduction

Node.js est un environnement d’exécution JavaScript à code source ouvert permettant de créer facilement des applications réseau et côté serveur. La plateforme fonctionne sous Linux, OS X, FreeBSD et Windows. Les applications Node.js peuvent être exécutées à partir de la ligne de commande, mais nous nous concentrerons sur leur exécution en tant que service afin qu’elles redémarrent automatiquement en cas de redémarrage ou d’échec et puissent être utilisées en toute sécurité dans un environnement de production.

Dans ce tutoriel, nous couvrirons la configuration d’un environnement Node.js prêt pour la production sur un seul serveur Debian 8. Ce serveur exécutera une application Node.js gérée par PM2 et fournira aux utilisateurs un accès sécurisé à l’application via un proxy inverse Nginx.

Conditions préalables

Ce guide suppose que vous avez un serveur Debian 8, configuré avec un utilisateur non root avec les privilèges + sudo +, comme décrit dans https://www.digitalocean.com/community/tutorials/initial-server-setup-with -debian-8 [guide de configuration initiale du serveur pour Debian 8].

Cela suppose également que vous avez un nom de domaine pointant vers l’adresse IP publique du serveur.

Commençons par installer le runtime Node.js sur votre serveur.

Installez Node.js

Nous allons installer la dernière version LTS de Node.js à l’aide des archives de paquets NodeSource.

Tout d’abord, vous devez installer le PPA NodeSource afin d’avoir accès à son contenu. Assurez-vous de vous trouver dans votre répertoire personnel et utilisez curl pour récupérer le script d’installation des archives Node.js 6.x:

cd ~
curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh

Vous pouvez inspecter le contenu de ce script avec nano (ou votre éditeur de texte préféré):

nano nodesource_setup.sh

Et lancez le script sous + sudo +:

sudo bash nodesource_setup.sh

Le PPA sera ajouté à votre configuration et votre cache de paquet local sera mis à jour automatiquement. Après avoir exécuté le script d’installation à partir de nodesource, vous pouvez installer le package Node.js de la même manière que ci-dessus:

sudo apt-get install nodejs

Le paquetage + nodejs + contient le binaire + nodejs + ainsi que + npm +, de sorte que vous n’avez pas besoin d’installer + npm + séparément. Toutefois, pour que certains packages + npm + fonctionnent (tels que ceux qui nécessitent la compilation du code source), vous devez installer le package + build-essential +:

sudo apt-get install build-essential

Le runtime Node.js est maintenant installé et prêt à exécuter une application! Écrivons une application Node.js.

Créer une application Node.js

Nous allons écrire une application Hello World qui renvoie simplement «Hello World» à toutes les requêtes HTTP. Ceci est un exemple d’application qui vous aidera à configurer votre Node.js, que vous pourrez remplacer par votre propre application. Assurez-vous simplement de modifier votre application pour écouter les adresses IP et les ports appropriés.

Bonjour Code du monde

Commencez par créer et ouvrez votre application Node.js pour l’éditer. Pour ce tutoriel, nous allons utiliser + nano + pour éditer un exemple d’application appelé + hello.js +:

cd ~
nano hello.js

Insérez le code suivant dans le fichier. Si vous le souhaitez, vous pouvez remplacer le port en surbrillance, ++, aux deux emplacements (veillez à utiliser un port non-admin, c’est-à-dire 1024 ou plus):

bonjour.js

#!/usr/bin/env nodejs
var http = require('http');
http.createServer(function (req, res) {
 res.writeHead(200, {'Content-Type': 'text/plain'});
 res.end('Hello World\n');
}).listen(, 'localhost');
console.log('Server running at http://localhost:/');

Maintenant, enregistrez et quittez.

Cette application Node.js écoute simplement l’adresse spécifiée (+ localhost +) et le port (++), et renvoie «Hello World» avec un code de réussite HTTP «+ 200 +». Comme nous écoutons * localhost *, les clients distants ne pourront pas se connecter à notre application.

Application de test

Pour nous permettre de tester l’application, sélectionnez l’exécutable hello.js +:

chmod +x ./hello.js

Et lancez-le comme ça:

./hello.js
OutputServer running at http://localhost:/

Pour tester l’application, ouvrez une autre session de terminal sur votre serveur et connectez-vous à * localhost * avec + curl +:

curl http://localhost:

Si vous voyez la sortie suivante, l’application fonctionne correctement et écoute l’adresse et le port appropriés:

OutputHello World

Si vous ne voyez pas la sortie appropriée, assurez-vous que votre application Node.js est en cours d’exécution et configurée pour écouter l’adresse et le port appropriés.

Une fois que vous êtes sûr que cela fonctionne, supprimez l’application (si vous ne l’avez pas déjà fait) en appuyant sur * Ctrl + C *.

Installer le PM2

Nous allons maintenant installer PM2, un gestionnaire de processus pour les applications Node.js. PM2 offre un moyen simple de gérer et de démonaliser les applications (les exécuter en arrière-plan en tant que service).

Nous allons utiliser + npm +, un gestionnaire de paquets pour les modules Node qui s’installe avec Node.js, pour installer PM2 sur notre serveur. Utilisez cette commande pour installer PM2:

sudo npm install -g pm2

L’option + -g + demande à + ​​npm + d’installer le module globally, afin qu’il soit disponible dans tout le système.

Gérer les applications avec PM2

PM2 est simple et facile à utiliser. Nous aborderons quelques utilisations de base des PM2.

Lancer l’application

La première chose que vous voudrez faire est d’utiliser la commande + pm2 start + pour exécuter votre application, + hello.js +, en arrière-plan:

pm2 start

Cela ajoute également votre application à la liste de processus de PM2, qui est sortie chaque fois que vous démarrez une application:

Output[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
[PM2] Starting  in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ memory      │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│     │ 0  │ fork │ 3524 │ online │ 0       │ 0s     │ 21.566 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app

Comme vous pouvez le constater, PM2 attribue automatiquement un * Nom de l’application * (basé sur le nom du fichier, sans l’extension + .js +) et un * id * de PM2. PM2 conserve également d’autres informations, telles que le * PID * du processus, son état actuel et l’utilisation de la mémoire.

Les applications exécutées sous PM2 seront automatiquement redémarrées si l’application se bloque ou est tuée, mais une étape supplémentaire doit être franchie pour que l’application se lance au démarrage du système (démarrage ou redémarrage). Heureusement, PM2 offre un moyen simple de procéder, la sous-commande + startup +.

La sous-commande + startup + génère et configure un script de démarrage pour lancer PM2 et ses processus gérés lors du démarrage du serveur. Vous devez également spécifier la plate-forme sur laquelle vous exécutez, qui est + ubuntu +, dans notre cas:

pm2 startup systemd

La dernière ligne de la sortie résultante inclura une commande que vous devez exécuter avec les privilèges de superutilisateur:

Output[PM2] You have to run this command as root. Execute the following command:

Exécutez la commande générée (similaire à la sortie mise en surbrillance ci-dessus, mais avec votre nom d’utilisateur à la place de ++) pour configurer PM2 pour qu’il démarre au démarrage (utilisez la commande à partir de votre propre sortie):

sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u  --hp /home/

Cela créera une unité * system * qui exécutera + pm2 + pour votre utilisateur au démarrage. Cette instance + pm2 +, à son tour, exécute + hello.js +. Vous pouvez vérifier le statut de l’unité systemd avec + systemctl +:

systemctl status pm2

Autre utilisation de PM2 (facultatif)

PM2 fournit de nombreuses sous-commandes qui vous permettent de gérer ou de rechercher des informations sur vos applications. Notez que si vous exécutez + pm2 + sans argument, une page d’aide, contenant un exemple d’utilisation, couvre l’utilisation de PM2 de manière plus détaillée que cette section du didacticiel.

Arrêtez une application avec cette commande (spécifiez le + nom de l’application ou le` + id` de PM2):

pm2 stop

Redémarrez une application avec cette commande (spécifiez le + nom de l’application ou le` + id` de PM2):

pm2 restart

La liste des applications actuellement gérées par PM2 peut également être consultée avec la sous-commande + list +:

pm2 list

Pour plus d’informations sur une application spécifique, utilisez la sous-commande + info + (spécifiez PM2 App name ou id):

pm2 info

Le moniteur de processus PM2 peut être extrait avec la sous-commande + monit +. Ceci affiche l’état de l’application, l’utilisation du processeur et de la mémoire:

pm2 monit

Maintenant que votre application Node.js est en cours d’exécution et gérée par PM2, configurons le proxy inverse.

Configurer Nginx en tant que serveur proxy inverse

Maintenant que votre application est en cours d’exécution et à l’écoute sur * localhost *, vous devez configurer un moyen permettant à vos utilisateurs d’y accéder. Nous allons configurer un serveur Web Nginx en tant que proxy inverse à cette fin. Ce tutoriel va configurer un serveur Nginx de toutes pièces. Si vous avez déjà une configuration de serveur Nginx, vous pouvez simplement copier le bloc + emplacement + dans le bloc de serveur de votre choix (assurez-vous que l’emplacement n’entre pas en conflit avec le contenu existant de votre serveur Web).

Premièrement, installez Nginx en utilisant apt-get:

sudo apt-get install nginx

Ouvrez maintenant le fichier de configuration de bloc de serveur par défaut pour l’éditer:

sudo nano /etc/nginx/sites-available/default

Supprimez tout le fichier et insérez la configuration suivante. Assurez-vous de substituer votre propre nom de domaine à la directive + nom_serveur +. En outre, modifiez le port (++) si votre application est configurée pour écouter sur un autre port:

/ etc / nginx / sites-available / default

server {
   listen 80;

   server_name ;

   location / {
       proxy_pass http://localhost:;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection 'upgrade';
       proxy_set_header Host $host;
       proxy_cache_bypass $http_upgrade;
   }
}

Cela configure le serveur pour répondre aux demandes à la racine. En supposant que notre serveur soit disponible sur + example.com +, accéder à + ​​http: // example.com / + via un navigateur Web enverrait la demande à + ​​hello.js +, en écoutant sur le port + 8080 + à * localhost *.

Vous pouvez ajouter des blocs + location + supplémentaires au même bloc de serveur pour permettre l’accès à d’autres applications sur le même serveur. Par exemple, si vous exécutiez également une autre application Node.js sur le port + 8081 +, vous pouvez ajouter ce bloc d’emplacement pour en permettre l’accès via + http: // example.com / app2 +:

Configuration Nginx - Emplacements supplémentaires

   location /app2 {
       proxy_pass http://localhost:;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection 'upgrade';
       proxy_set_header Host $host;
       proxy_cache_bypass $http_upgrade;
   }

Une fois que vous avez terminé d’ajouter les blocs d’emplacement pour vos applications, enregistrez et quittez.

Assurez-vous de ne pas avoir introduit d’erreurs de syntaxe en tapant:

sudo nginx -t

Ensuite, redémarrez Nginx:

sudo systemctl restart nginx

Ensuite, autorisez le trafic vers Nginx via un pare-feu, si vous l’avez activé.

Si vous utilisez * ufw *, vous pouvez utiliser la commande suivante:

sudo ufw allow 'Nginx Full'

Avec * ufw *, vous pouvez toujours vérifier l’état avec la commande suivante:

sudo ufw status

Si vous utilisez plutôt * IPTables *, vous pouvez autoriser le trafic vers Nginx à l’aide de la commande suivante:

sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Vous pouvez toujours vérifier l’état de vos IPTables en exécutant la commande suivante:

sudo iptables -S

En supposant que votre application Node.js est en cours d’exécution et que vos configurations d’application et de Nginx sont correctes, vous devriez maintenant pouvoir accéder à votre application via le proxy inverse Nginx. Essayez-le en accédant à l’URL de votre serveur (son adresse IP publique ou son nom de domaine).

À partir de là, vous devriez continuer à sécuriser votre configuration en lisant How Sécuriser Nginx avec Let’s Encrypt sur Debian 8.

Conclusion

Toutes nos félicitations! Votre application Node.js s’exécute maintenant derrière un proxy inverse Nginx sur un serveur Debian 8. Cette configuration de proxy inverse est suffisamment souple pour permettre à vos utilisateurs d’accéder à d’autres applications ou à du contenu Web statique que vous souhaitez partager. Bonne chance avec votre développement Node.js!