Déployer efficacement ses applications Node.js

Hello ! J'ai récemment dû trouver un moyen pour déployer facilement mon app Node sur un serveur dédié ou un VPS. Cet article s'adresse uniquement aux utilisateurs de GNU/Linux et ne vaut rien non plus si vous utilisez une plateforme comme Heroku en tant que serveur. Vous devez aussi utiliser git. On peut même déployer sur plusieurs serveurs, par exemple, un pour le développement et un pour la production.

Tout d'abord, je vous propose de suivre un tutoriel pour vous connecter sans mot de passe à votre serveur via SSH. Enfin après si vous aimez taper votre mot de passe, libre à vous. :-)

Installation des outils

Pour déployer, j'utilise deploy. On va donc devoir le télécharger et l'installer :

1
2
3
4
$ cd /tmp # Ne polluons pas nos dossiers :-)
$ git clone https://github.com/visionmedia/deploy.git # blop blop ça télécharge
$ cd deploy
$ make install

Configuration

Nous devons ensuite créer un fichier de configuration. Par défaut, il doit se nommer deploy.conf. Je l'ai placé pour ma part à la racine de mon app. Il doit avoir une tête similaire à ça :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Entre crochet, le nom de votre serveur
[development]
# L'utilisateur qui va lancer votre app sur le serveur
user node
# L'adresse IP ou l'url vers votre serveur
host blog.alexis.delrieu.me
# Votre dépôt git
repo git@git.assembla.com:foobarbaz.git
# Le chemin vers lequel déployer sur le serveur
path /home/node/app1
# La branche à déployer
ref origin/dev
# Une commande à exécuter après le déploiement,
# ici un script qui installe les dépendances via npm et qui (re)lance le serveur
post-deploy ./update.sh

# Bien évidemment, vous pouvez ajouter d'autres serveurs, par exemple pour la prod' :
[production]
user node
host blog.alexis.delrieu.me
repo git@git.assembla.com:foobarbaz.git
path /home/node/app2
ref origin/master
post-deploy ./update.sh

Installation sur le serveur

Attention, si votre dépôt est privé et que vous utilisez github ou assembla (ou d'autres services similaires) pour héberger votre dépôt git, il vous faudra probablement ajouter la clef publique (~/.ssh/id_rsa.pub) de votre serveur à votre compte github/assembla.

Une petite commande pour installer les dossiers nécessaires à deploy :

1
$ deploy development setup

Un script pour (re)lancer notre serveur

J'ai créé un mini script bash (update.sh dans la conf' précédente) pour installer automatiquement les dépendances de node puis de lancer ensuite notre app.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

# update dependencies
echo "Update dependencies..."
npm install

# (re)Start the server

list=`forever list --plain`
condition='info:    No forever processes running'

if [ "$list" == "$condition" ]
then
	echo "No process running: start the server..."
	forever start -l forever.log -o out.log -e err.log -a app.js
else
	echo "Restart the server..."
	forever restartall
fi

Il lance Node avec forever. C'est un module qui permet de lancer Node et qui le relance en cas de crash. Assurez-vous qu'il est bien installé sur votre serveur, dans le cas contraire, faites un simple :

1
$ npm install forever -g

DÉ-PLOIIIE-MEEEEENNNT ! \o/

Vérifiez que vous avez bien fait vos commit et vos push puis exécutez cette commande pour déployer :

1
$ deploy development

Et voilà, normalement c'est bon. Vous n'aurez qu'à réitérer la dernière commande à chaque fois que vous voudrez mettre à jour votre application sur votre serveur. Il faut noter que cette méthode ne fait quasiment pas de downtime. Cependant, on ne peut pas déployer sur un cluster. Comme je n'en ai pas eu le besoin, je n'ai pas fait de script pour le faire, mais je suis certain que c'est réalisable sans trop de difficultés.

Faut-il minifier une concaténation de code minifié ?

À travers cet article portant fièrement un titre chinois pour les non-initiés au développement web, nous allons voir s'il faut fournir du code minifié à UglifyJS pour qu'il produise son propre code minifié.

La minification pour les nuls :

Chaque développeur web un peu soucieux des performances de son site, va tout d'abord minifier ses scripts JavaScript. Cela consiste à enlever tout ce qui est inutile pour la machine (espaces blancs, commentaires, etc.) mais utile pour l'homme qui confectionne ce code avec amour. Cela permet de réduire la taille des fichiers et d'accélérer le chargement des sites web. De plus il peut les concaténer (les ajouter bout à bout) afin de réduire le nombre de requêtes HTTP ce qui aura pour conséquence d'accélérer encore une fois le chargement du site par le visiteur.

Un petit benchmark

J'ai donc fait un petit script pour mettre tout le monde d'accord : (les librairies choisies sont un pur hasard)

La méthode minify d'Uglify permet de minifier et de "mangler" (raccourcit le nom des variables) le code. Comme je passe un array en argument, il va s'occuper de concaténer tous les scripts tout seul comme un grand pour ne donner qu'un seul fichier.

Et en output, j'obtiens donc :

1
Compressed: 728144 / Uncompressed: 738180 | 0.986% (40.2s)
WTF!? Je m'attendais à une différence négligeable mais, en faveur du non compressé. Or ici Uglify produit un code plus court si on lui fournit du code minifié. C'est...étrange...

Bref vous avez perdu votre temps à lire ça ;-)

Le résultat est à mon goût négligeable donc inutile de changer vos pratiques. De plus il est fort probable que ce résultat varie en fonction des cas.

Rassurez vous, je ne suis pas encore assez fou pour avoir ce genre d'idée seul, remercions plutôt @nhoizey : (et @madsgraphics pour ses suppositions)
tweet de nhoizey

Sinon j'aimerais ajouter que je n'ai aucune idée du pourquoi de ce résultat, donc si vous avez envie d'exposer vos suppositions au reste du monde dans les commentaires, n'hésitez pas. :-)

Node.js pour les nuls

Dans cet article je vais vous proposer une petite initiation à Node.js. C'est vrai que trouver toutes les ressources nécessaires lorsque l'on débute n'est pas forcément facile. Il est préférable d'avoir quelques connaissances en JavaScript pour lire cet article. Dans le cas contraire, je vous invite à suivre cet excellent tutoriel : Dynamisez votre site web avec Javascript !.

Introduction

NodeJS est un programme qui va vous permettre de coder en JavaScript côté serveur. Il est basé sur V8, le moteur JS de Google Chrome. Notons que ses input/output sont asynchrones. Cela signifie que lorsque par exemple vous voudrez lire un fichier du disque dur, vous direz à votre programme « Hey lis moi ça et rappelle moi quand tu as finis », pendant ce temps-là celui-ci continuera de gérer les autres requêtes etc. Imaginons que lorsque vous devez délivrer une page, celle-ci nécessite deux requêtes SQL de 300ms chacune et lire un fichier txt (100ms), avec PHP vous auriez dû faire une requête SQL (500ms), puis une autre (500ms), puis lire le fichier txt (100ms). Votre serveur aurait mis 1100ms à rendre la page. Et bien là avec NodeJS vous demandez tout en même temps et vous renvoyez la page lorsque les opérations sont finies. Votre page sera renvoyée en 500ms (temps de l'opération la plus longue). Vous vous demanderez bientôt comment vous faisiez avant ;-) Cependant, si vous en avez besoin, vous pouvez parfaitement lancer ces mêmes fonctions en synchrones.

Une autre chose à savoir si vous venez de PHP, c'est que Node.js est aussi un serveur HTTP. Lorsque vous programmez avec PHP, vous avez besoin d'apache pour gérer les requêtes HTTP. Et bien là plus besoin d'Apache, NodeJS gère aussi les requêtes HTTP comme un grand. Pour votre culture générale, sachez qu'en production, beaucoup de gros sites utilisent nginx ou apache comme proxy par-dessus.

Les indispensables

  • NPM Une des plus grandes forces de Node.js : NPM. C'est un système de paquets où de nombreux développeurs ajoutent des modules prêts à l'emploi. Le nombre de module est vraiment énorme, c'est une vraie mine d'or. Cela vous évitera de nombreuses nuits à coder des choses déjà codées par d'autres. Vous voulez récupérer la météo de Google ? Paf une recherche et vous avez un module tout fait qui vous propose une API simpliste.
  • Express Le serveur web le plus connu. Relativement simpliste, il reste néanmoins puissant.
  • socket.io Pour faire du real-time cross-browser entre votre serveur et vos clients.
  • Async Pour gérer un grand nombre de tâches asynchrones en simultanées.

Sites pour apprendres

Autres

Comme je l'ai dit précédemment, un gros atout de Node est son système de modules. N'hésitez jamais avant de coder quelque chose si quelqu'un ne l'a pas fait avant vous.

Vous pouvez utiliser avec Node.js n'importe quel système de base de données ; MySQL, ProstrgreSQL, MongoDB, CouchDB, Redis, et pleins d'autres. Vous trouverez les drivers pour les utiliser sur NPM.

Bref je ferais sûrement d'autres articles dessus pour vous en parler. Si vous avez des questions, n'hésitez pas à laisser un petit commentaire. Vous pouvez aussi me suivre sur Twitter, je fais quotidiennement ma petite veille en vous partageant les liens les plus intéressants.

first post

Hello! Cela fait un petit moment que je voulais me créer un petit blog pour vous m'exprimer ou vous faire partager des articles plus ou moins techniques. Ce blog parlera évidemment de JavaScript, d'HTML5 et d'autres trucs dans le genre. Mais je compte aussi parler de sujets ne concernant pas l'informatique. Je vous ferais sûrement un petit article sur mon TPE sur le train à sustentation magnétique.

N'ayant pas grand-chose à dire dans ce premier post, je vais essayer de meubler un peu. Donc pour ceux que ça intéresse, le blog tourne en JavaScript avec NodeJS of course. Pour cela j'utilise un petit générateur de blogs statiques : hexo.

P.-S. N'oubliez pas d'ajouter le flux RSS à votre agrégateur ;)