Instance Node.js

Cette instance s'adresse à tous les développeurs souhaitant héberger un site web dynamique développé en Node.js

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 utilisons les versions 0.8.x et 0.10.x pour le moment ; Node.js ne possèdant pas réellement de gestion de durée de vie sur les différentes branches, il est donc difficile de savoir combien de temps nous allons supporter une version donnée. La version par défaut est toujours la version la plus récente parmi celles installées, actuellement 0.10.x. Pour choisir la version de Node.js à utiliser pour exécuter votre application, voir Sélection de la version de Node.js.

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, votre application doit écouter sur le port 8080.

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(8080);

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

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 champs “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 champs “engines“, voir https://npmjs.org/doc/json.html#engines [en].

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: '/var/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(8080);

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.

Websockets

Nous ne supportons pas l'utilisation des websockets, Simple Hosting se voulant un service HTTP(S)

Voir aussi

Dernière modification: le 07/03/2014 à 17:57 par Ryan A. (Gandi)