Instance Node.js

Simple Hosting Node.js vous permet d'héberger des applications Node.js qui montent en échelle simplement et de manière économique.

Prérequis

  • Connaissances basiques de Node.js et du protocole HTTP
  • Votre site doit utiliser NPM pour gérer ses dépendances

Support des versions

Nous supportons les versions 0.12.x, 0.10.x et 0.8.x de Node.js.

La version par défaut est toujours la version la plus récente parmi celles installées, actuellement 0.12.x. Pour choisir la version de Node.js à utiliser pour exécuter votre application, voir Sélection de la version de Node.js.

Node.js ne possède pas réellement de gestion de durée de vie des différentes versions, et nous ne pouvons donc savoir combien de temps nous allons supporter une version donnée.

Fonctionnement général

Votre application Node.js doit être composée au minimum d'un fichier nommé server.js. Ce fichier sera exécuté par l'interpréteur Node.js lors du démarrage de votre instance ou lors d'un déploiement avec l'accés Git. Afin de recevoir les requêtes HTTP et HTTPS, votre application doit écouter sur le port spécifié par la variable d'environnement PORT (process.env.PORT).

Vhosts

Contrairement aux instances PHP, chaque création de vhost ne crée pas un dossier spécifique sur votre disque. Le dossier nommé default présent dans vhosts permet de gérer les données pour votre instance Node.js. Une seule instance de votre application est exécutée, et doit gérer tous les vhosts que vous avez associé à votre instance Simple Hosting.

Exemples

Exemple d'une simple application Node.js affichant le nom du vhost

server.js

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.write('Hello Node.js!\n');
    if ('host' in req.headers) {
        var host = req.headers['host'];
        res.write('Vhost is ' + host.split(':')[0] + '\n');
    } else {
        res.write('No vhost specified\n');
    }
    res.end();
}).listen(process.env.PORT);

Exemple vhost avec express.js : https://github.com/visionmedia/express/blob/master/examples/vhost/index.js

Démarrage

Simple Hosting supporte 3 façons de démarrer une application Node.js.

La plateforme essayera de démarrer votre application suivant cette séquence :

  1. Depuis le “start script” défini dans le fichier package.json
  2. Depuis le champs “main” du le fichier package.json
  3. Depuis un fichier server.js s'il existe à la racine de l'application

L'ordre de démarrage a changé en Décembre 2015. Avant, les applications étaient démarrées en priorité à partir du fichier server.js.

Avec package.json (recommandé)

La manière “standard” de démarrer une application Node.js est d'utiliser les instructions définies dans package.json.

Alors que Simple Hosting ne supportait pas cette fonctionnalité originalement, elle est désormais la manière recommandée de démarrer votre application.

Le fichier package.json doit être placé à la racine de votre application. Il doit contenir un champ package.json[“main”] pour définir un point d'entrée, ou contenir une commande de démarrage dans le champ package.json[“scripts”][“start”].

La plupart des applications Node.js pré-packagées, comme par exemple le moteur de blogs Ghost, utilisent déjà cette convention et il est donc plus facile de les installer.

Définir un point d'entrée

Vous pouvez définir un point d'entrée dans le champs main de package.json.

Il vous suffit d'introduire le nom d'un fichier placé à la racine de votre application pour que Simple Hosting l'utilise pour démarrer votre application.

Par exemple, pour démarrer à partir du fichier “index.js”:

package.json

{
  "name" : "foo",
  "version" : "1.2.3",
  "description" : "A packaged foo fooer for fooing foos",
  "main" : "index.js",
}

Définir une commande de démarrage

Vous pouvez définir vous-même la commande de démarrage dans le champs ['scripts']['start'].

Simple Hosting va simplement éxecuter cette commande pour démarrer votre application.

L'exemple suivant est équivalent à l'exemple de “point d'entrée” décrit plus haut :

package.json

{
  "name" : "foo",
  "version" : "1.2.3",
  "description" : "A packaged foo fooer for fooing foos",
  "scripts": {
    "start": "node index.js"
  }
}

Le script de démarrage est très flexible et vous permet de personnaliser la manière de démarrer votre application.

Par exemple, vous pouvez activer le support ES6 en lançant Node.js en mode harmony.

package.json

{
  "name" : "foo-ecma-script",
  "version" : "6",
  "description" : "ES6 on Simple Hosting",
  "engines": {
    "node": ">=0.12"
  },
  "scripts": {
    "start": "node --harmony index.js"
  }
}

Vous pouvez également utiliser cette fonctionnalité avec des variables d'environnement pour démarrer votre application avec des gestionnaires de processus tels que pm2. Ou encore pour expérimenter avec les threads grâce à libuv.

Avec server.js

La manière la plus simple de créer une application Node.js sur Simple Hosting est de placer un fichier nommé server.js à la racine de votre projet.

Cette méthode était utilisée par défaut jusqu'en Décembre 2015.

Variables d'environnement

Vous pouvez utiliser les variables d'environnement pour lire ou définir des options de configuration, au niveau de la plateforme ou de votre application.

Voici quelques exemples de variables d'environnement définies par Simple Hosting :

  • PORT=8080
  • NODE_ENV=production
  • WEB_MEMORY=128
  • WEB_CONCURRENCY=2

Les valeurs de WEB_MEMORY et WEB_CONCURRENCY dépendent de la taille de votre instance (S, M, L, XL, XXL). La première correspond à la valeur maximale. La dernière peut être modifiée selon vos critères, la valeur par défaut étant celle que nous recommandons.

Lire les variables d'environnement

Vous pouvez accéder aux variables d'environnement normalement, c'est-à-dire depuis process.env.

Par exemple :

var port = process.env.PORT;
console.log(process.env.PORT);
// 8080

Définir des variables d'environnement

Vous pouvez définir ou réecrire des variables d'environnement depuis votre application ou depuis la commande de démarrage.

Depuis votre application, il suffit de définir les variables en utilisant process.env. Par exemple :

process.env.NODE_ENV = "staging";
console.log(process.env.NODE_ENV); // => "staging"

Au démarrage, pour pouvez utiliser le champs package.json['scripts']['start'] pour définir une ou plusieurs variables d'environnement au style shell.

Par exemple :

package.json

{
...
  "scripts": {
    "start": "NODE_ENV=staging node index"
  }
}

Assurez-vous de ne pas écraser la variable d'environnement PORT, puisque vous pourriez perdre la connectivité avec la plateforme. De manière générale, veillez à ne pas écraser des variables d'environnement importantes avant de lancer votre application.

Installation des dépendances de votre site

La plateforme Simple Hosting Node.js se charge lors d'un déploiement via l’accès Git, d'installer les dépendances de votre site. Pour cela vous devez spécifier les dépendances dans le fichier “package.json” à la racine du vhost, soit dans 'vhost/default' :

package.json

{
  "name": "website",
  "version": "0.0.1",
  "dependencies": {
    "express": "3.x"
  }
}

Lors de l'installation, 'npm install' est lancé avec le paramètre '–production' par défaut. Il n'est pas possible de modifier ce paramètre

Sélection de la version de Node.js

Il est possible de choisir la version de Node.js à utiliser pour exécuter votre application parmi celles disponibles. Pour cela, il suffit de spécifier dans le fichier “package.json“ la version de Node.js que vous souhaitez en utilisant le champ “engines“.

package.json

{
  "name": "website",
  "version": "0.0.1",
  "engines": {
    "node": "< 0.10"
  }
}

L'exemple ci dessus forcera l'utilisation de la version 0.8.x de Node.js. Pour plus d'information sur le champ “engines“, voir https://npmjs.org/doc/json.html#engines [en].

Websockets

Il est désormais possible d'utiliser les Websockets sur les instances NodeJS (en Beta) !

Reportez vous à la page http://wiki.gandi.net/fr/simple/websockets pour plus d'informations.

Logs

Les sorties standard et d'erreur de votre site sont redirigées vers un fichier de log sur votre disque :

  • via la console SSH : /srv/data/var/log/www/nodejs.log
  • via SFTP : /lamp0/var/log/www/nodejs.log

Ce fichier de log contient également la sortie du programme NPM chargé d'installer les dépendances de votre site. En complément vous pouvez consulter l'historique des actions effectuées par le programme chargé de démarrer votre site :

  • via la console SSH : /srv/data/var/log/www/nodejs-watchd.log
  • via SFTP : /lamp0/var/log/www/nodejs-watchd.log

Vous pourrez surveiller si votre application Node.js a correctement démarré.

Base de données

MySQL

    connection: {
        host: '127.0.0.1',
        socketPath: '/srv/run/mysqld/mysqld.sock',
        user: 'user',
        password: 'pwd',
        database: 'db',
        charset: 'utf8'
    }

PostgreSQL

Pour le moment l'instance Node.js vient avec la base de données PostgreSQL. Notez que PostgreSQL9.2 ajoute le support le type de données JSON; c'est à dire que vous pouvez désormais directement stocker des données au format JSON. Vous pouvez aussi manipuler des tables existantes et obtenir le résultat au format JSON grâce aux fonctions array_to_json and row_to_json.

Exemple complet avec utilisation de la base de données :

server.js

var http = require('http');
var pg = require('pg');
 
var conString = "tcp://pguser:password@localhost/mycms";
 
function list_articles(callback) {
    var client = new pg.Client(conString);
    client.connect(function(err) {
        if (err) {
            callback(null, err);
        } else {
            client.query('SELECT * FROM articles ORDER BY art_id DESC;',
                         callback);
        }
    });
}
 
function handle_error(res) {
    res.writeHead(500, {'Content-Type': 'text/plain'});
    res.end('Internal Server Error\n');
}
 
function write_response(res, result) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.write('Number of articles: ' + result.rowCount + '\n');
    result.rows.forEach(function(row) {
        res.write(row.art_id + ' | ' + row.art_title + '\n');
    });
    res.end();
}
 
server = http.createServer(function(req, res) {
    list_articles(function(err, result) {
        if (err) {
            console.log(err);
            handle_error();
        } else {
            write_response(res, result);
        }
    });
});
 
server.listen(process.env.PORT);

package.json

{
  "name": "website",
  "version": "0.0.1",
  "dependencies": {
    "pg": "0.x"
  }
}

MongoDB

Il est désormais possible de créer des instances Node.js/mongoDB.

Problèmes connus

PostgreSQL

L'installation du module pg ne fonctionne pas en utilisant la version de npm livrée avec Node.js 0.10.x. Il est pour l'instant conseillé de sélectionner la version 0.8.x de Node.js, en suivant les instructions de la section Sélection de la version de Node.js.

Lors de l'installation du module pg, les messages d'erreurs suivants apparaissent :

gyp WARN EACCES user "root" does not have permission to access the dev dir "/srv/data/.node-gyp/0.8.22"
gyp WARN EACCES attempting to reinstall using temporary dev dir "/srv/data/tmp/.node-gyp"
You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application.
gyp: Call to 'pg_config --libdir' returned exit status 1. while trying to load binding.gyp
gyp ERR! configure error 
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onCpExit (/usr/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:416:16)
gyp ERR! stack     at ChildProcess.EventEmitter.emit (events.js:99:17)
gyp ERR! stack     at Process._handle.onexit (child_process.js:678:10)
gyp ERR! System Linux 3.4.7-grsec-paas-19c573d
gyp ERR! command "node" "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /srv/data/web/vhosts/default/node_modules/pg
gyp ERR! node -v v0.8.22
gyp ERR! node-gyp -v v0.8.5
gyp ERR! not ok 

Le module pg est quand même installé, mais limité à l'implémentation en Javascript. La correction est en cours.

Voir aussi

Dernière modification: le 07/12/2015 à 14:52 par Alexandre L. (Gandi)