Comment configurer une application Node.js pour la production sur Ubuntu 14.04

introduction

Node.js is an open source Javascript runtime environment for easily building server-side and networking applications. La plate-forme fonctionne sous Linux, OS X, FreeBSD et Windows, et ses applications sont écrites en JavaScript. Node.js applications can be run at the command line but we will teach you how to run them as a service, so they will automatically restart on reboot or failure, so you can use them in a production environment.

Dans ce didacticiel, nous couvrirons la configuration d’un environnement Node.js prêt à la production composé de deux serveurs Ubuntu 14.04; un serveur exécutera les applications Node.js gérées par PM2, tandis que l'autre fournira aux utilisateurs un accès à l'application via un proxy inverse Nginx vers le serveur d'applications.

La version CentOS de ce tutoriel peut être trouvéehere.

Conditions préalables

Ce guide utilise deux serveurs Ubuntu 14.04with private networking (dans le même centre de données). Nous nous y référerons par les noms suivants:

  • app: Le serveur sur lequel nous installerons le runtime Node.js, votre application Node.js et PM2

  • web: Le serveur sur lequel nous installerons le serveur Web Nginx, qui agira en tant que proxy inverse pour votre application. Les utilisateurs accéderont à l’adresse IP publique de ce serveur pour accéder à votre application Node.js.

Il est possible d'utiliser un seul serveur pour ce didacticiel, mais vous devrez apporter quelques modifications en cours de route. Utilisez simplement l’adresse IP localhost, c.-à-d. 127.0.0.1, partout où l'adresse IP privée du serveurapp est utilisée.

Voici un schéma de ce que sera votre configuration après avoir suivi ce tutoriel:

Reverse Proxy to Node.js Application

Avant de commencer ce guide, vous devez avoir un utilisateur normal non root avec les privilègessudo configurés sur vos deux serveurs - c'est l'utilisateur sous lequel vous devez vous connecter à vos serveurs. Vous pouvez apprendre à configurer un compte d'utilisateur normal en suivant les étapes 1 à 4 de nosinitial server setup guide for Ubuntu 14.04.

Si vous souhaitez pouvoir accéder à votre serveurweb via un nom de domaine, au lieu de son adresse IP publique, achetez un nom de domaine puis suivez ces tutoriels:

Commençons par installer le runtime Node.js sur le serveurapp.

Installez Node.js

Nous installerons la dernière version LTS de Node.js, sur le serveurapp.

Sur le serveurapp, mettons à jour les listes de paquets apt-get avec cette commande:

sudo apt-get update

Ensuite, utilisezapt-get pour installer le packagegit, dontnpm dépend:

sudo apt-get install git

Accédez auxNode.js Downloads page et trouvez le lien de téléchargement deLinux Binaries (.tar.xz). Cliquez dessus avec le bouton droit de la souris et copiez l'adresse de son lien dans le Presse-papiers. Au moment d'écrire ces lignes, la dernière version de LTS est4.2.3. Si vous préférez installer la dernière version stable de Node.js, accédez auappropriate page et copiez ce lien.

Accédez à votre répertoire personnel et téléchargez la source Node.js avecwget. Collez le lien de téléchargement à la place de la partie mise en évidence:

cd ~
wget https://nodejs.org/dist/v4.2.3/node-v4.2.3-linux-x64.tar.gz

Extrayez maintenant l'archive tar que vous venez de télécharger dans le répertoirenode avec ces commandes:

mkdir node
tar xvf node-v*.tar.?z --strip-components=1 -C ./node

Si vous souhaitez supprimer l'archive Node.js que vous avez téléchargée, puisque nous n'en avons plus besoin, accédez à votre répertoire personnel et utilisez cette commanderm:

cd ~
rm -rf node-v*

Ensuite, nous allons configurer lesprefix globaux denpm, oùnpm créera des liens symboliques vers les packages Node installés, vers un emplacement dans votre chemin par défaut. Nous allons le définir sur/usr/local avec cette commande:

mkdir node/etc
echo 'prefix=/usr/local' > node/etc/npmrc

Nous sommes maintenant prêts à déplacer les binairesnode etnpm vers notre emplacement d'installation. Nous allons le déplacer dans/opt/node avec cette commande:

sudo mv node /opt/

À ce stade, vous souhaiterez peut-être faire deroot le propriétaire des fichiers:

sudo chown -R root: /opt/node

Enfin, créons des liens symboliques des binairesnode etnpm dans votre chemin par défaut. Nous allons mettre les liens dans/usr/local/bin avec ces commandes:

sudo ln -s /opt/node/bin/node /usr/local/bin/node
sudo ln -s /opt/node/bin/npm /usr/local/bin/npm

Vérifiez que Node est installé en vérifiant sa version avec cette commande:

node -v

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 maintenant créer une applicationHello 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 que vous modifiez votre application pour écouter les adresses IP et les ports appropriés.

Étant donné que nous voulons que notre application Node.js traite les requêtes provenant de notre serveur proxy inverse,web, nous utiliserons l’interface de réseau privé de notre serveurapp pour la communication entre serveurs. Recherchez l'adresse de réseau privé de votre serveurapp.

Si vous utilisez un droplet DigitalOcean comme serveur, vous pouvez rechercher l’adresse IP privée du serveur via le serviceMetadata. Sur le serveurapp, utilisez la commandecurl pour récupérer l'adresse IP maintenant:

curl -w "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address

Vous voudrez copier le résultat (l'adresse IP privée), car il sera utilisé pour configurer notre application Node.js.

Bonjour Code du monde

Ensuite, créez et ouvrez votre application Node.js pour l’éditer. Pour ce tutoriel, nous utiliseronsvi pour éditer un exemple d'application appeléhello.js:

cd ~
vi hello.js

Insérez le code suivant dans le fichier et assurez-vous de remplacer l’adresse IP privée du serveurapp par les deux élémentsAPP_PRIVATE_IP_ADDRESS en surbrillance. Si vous le souhaitez, vous pouvez également remplacer le port en surbrillance,8080, aux deux emplacements (assurez-vous d'utiliser un port non-admin, c.-à-d. 1024 ou plus):

hello.js

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

Maintenant, enregistrez et quittez.

Cette application Node.js écoute simplement sur l'adresse IP et le port spécifiés et renvoie «Hello World» avec un code de réussite HTTP200. Cela signifie que l'application n'est accessible qu'à partir de serveurs sur le même réseau privé, comme notre serveurweb.

Application de test (facultatif)

Si vous souhaitez tester si votre application fonctionne, exécutez cette commandenode sur le serveurapp:

node hello.js

Note: L'exécution d'une application Node.js de cette manière bloquera les commandes supplémentaires jusqu'à ce que l'application soit supprimée en appuyant surCTRL+C.

Afin de tester l'application, ouvrez une autre session de terminal et connectez-vous à votre serveurweb. Étant donné que le serveur Web se trouve sur le même réseau privé, il doit pouvoir atteindre l'adresse IP privée du serveurapp en utilisantcurl. Veillez à remplacer l’adresse IP privée du serveurapp parAPP_PRIVATE_IP_ADDRESS et par le port si vous l’avez modifiée:

curl http://APP_PRIVATE_IP_ADDRESS:8080

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

Output:Hello 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 IP et le port appropriés.

Sur le serveurapp, assurez-vous de tuer l'application (si vous ne l'avez pas déjà fait) en appuyant surCTRL+C.

Installer le PM2

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

Nous utiliserons Node Packaged Modules (NPM), qui est essentiellement un gestionnaire de packages pour les modules Node qui s'installe avec Node.js, pour installer PM2 sur notre serveurapp. Utilisez cette commande pour installer PM2:

sudo npm install pm2 -g

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 commandepm2 start pour exécuter votre application,hello.js, en arrière-plan:

pm2 start hello.js

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

Output:┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
│ App name │ id │ mode │ PID  │ status │ restarted │ uptime │     memory │ watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
│ hello    │ 0  │ fork │ 5871 │ online │         0 │ 0s     │ 9.012 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘

Comme vous pouvez le voir, PM2 assigne automatiquement unApp name (basé sur le nom de fichier, sans l'extension.js) et un PM2id. PM2 conserve également d'autres informations, telles que lesPID 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 fournit un moyen simple de le faire, la sous-commandestartup.

La sous-commandestartup génère et configure un script de démarrage pour lancer PM2 et ses processus gérés au démarrage du serveur. Vous devez également spécifier la plate-forme sur laquelle vous utilisez, qui estubuntu, dans notre cas:

pm2 startup ubuntu

La dernière ligne de la sortie résultante inclura une commande (qui doit être exécutée avec les privilèges de superutilisateur) que vous devez exécuter:

Output:[PM2] You have to run this command as root
[PM2] Execute the following command :
[PM2] sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"

Exécutez la commande générée (similaire à la sortie en surbrillance ci-dessus) pour configurer PM2 afin qu'elle démarre au démarrage (utilisez la commande de votre propre sortie):

 sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"

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 l'exécution depm2 sans aucun argument affichera une page d'aide, comprenant des exemples d'utilisation, qui couvre l'utilisation de PM2 plus en détail que cette section du didacticiel.

Arrêtez une application avec cette commande (spécifiez les PM2App name ouid):

pm2 stop example

Redémarrez une application avec cette commande (spécifiez les PM2App name ouid):

pm2 restart example

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

pm2 list
Plus d'informations sur une application spécifique peuvent être trouvées en utilisant la sous-commandeinfo (spécifiez les PM2App name ouid)
pm2 info example

Le moniteur de processus PM2 peut être extrait avec la sous-commandemonit. 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 un serveur proxy inverse

Maintenant que votre application est en cours d'exécution et écoute sur une adresse IP privée, 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 bloclocation dans le bloc serveur de votre choix (assurez-vous que l'emplacement n'est pas en conflit avec le contenu existant de votre serveur Web).

Sur le serveurweb, mettons à jour les listes de paquets apt-get avec cette commande:

sudo apt-get update

Puis 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 vi /etc/nginx/sites-available/default

Supprimez tout le fichier et insérez la configuration suivante. Assurez-vous de remplacer votre propre nom de domaine pour la directiveserver_name (ou l'adresse IP si vous n'avez pas de domaine configuré), et l'adresse IP privée du serveurapp pour lesAPP_PRIVATE_IP_ADDRESS . De plus, modifiez le port (8080) si votre application est configurée pour écouter sur un autre port:

/etc/nginx/sites-available/default

server {
    listen 80;

    server_name example.com;

    location / {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS:8080;
        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 serveurweb pour répondre aux requêtes à sa racine. En supposant que notre serveur est disponible àexample.com, accéder àhttp://example.com/ via un navigateur Web enverrait la demande à l'adresse IP privée du serveur d'application sur le port8080, qui serait reçue et répondue par le Application Node.js.

Vous pouvez ajouter des blocslocation supplémentaires au même bloc serveur pour fournir l'accès à d'autres applications sur le même serveurweb. Par exemple, si vous exécutiez également une autre application Node.js sur le serveurapp sur le port8081, vous pouvez ajouter ce bloc d'emplacement pour en autoriser l'accès viahttp://example.com/app2:

Configuration Nginx - Emplacements supplémentaires

    location /app2 {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS:8081;
        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.

Sur le serveurweb, redémarrez Nginx:

sudo service nginx restart

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

Conclusion

Toutes nos félicitations! Votre application Node.js s'exécute maintenant derrière un proxy inverse Nginx sur des serveurs Ubuntu 14.04. 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!

De plus, si vous cherchez à crypter les transmissions entre votre serveur Web et vos utilisateurs,here is a tutorial that will help you get HTTPS (TLS/SSL) support set up.