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

Versions supportées

Node.js 6 LTS est installé par défaut et supporté sur les nouvelles instances Node.js

Vous pouvez néanmoins choisir votre propre version de Node.js et de npm en configuration le fichier package.json.

Pour choisir la version de Node.js à utiliser pour exécuter votre application, voir Sélection de la version de Node.js.

Sur les instances précédentes, nous supportons les versions 4 LTS, 0.12.x 0.10.x et 0.8.x de Node.js et vous pouvez également utiliser la version de Node.js votre choix (mais pas de npm pour la série 0.x.x).

Version de votre choix

Vous pouvez installer d'autres versions de Node.js, à partir du moment où elle est supportée et distribuée par Node Version Manager ("nvm").

Veuillez consulter la section Sélection de la version de Node.js pour en savoir plus.

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": "6"
  },
  "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

Vous pouvez utiliser n'importe quelle version Node.js et de npm supportées par Node Version Manager (nvm).

Il vous suffit de définir les numéros des versions désirées dans les propriétés engines["node"] et engines["npm"] .

{
  "engines": {
    "node": "6",
    "npm": "*"
  }
}

Les versions demandées seront installées pendant la phase de build, après avoir poussé le code de votre projet sur votre instance avec git et avoir lancé la commande “deploy” via SSH.

Node.js legacy

Fichier .nvmrc

Simple Hosting peut installer la version de Node.js de votre choix grâce à Node Version Manager (nvm).

Créez un fichier nommé ”.nvmrc” à la racine de votre projet et écrivez-y la version désirée. Quand vous déploierez votre code, Simple Hosting détectera l'existence de ce fichier (cela ne fonctionnera pas si vous créez simplement le fichier via sFTP ou SSH). Si nécessaire, la plateforme installera la version de Node.js détectée avec “nvm” avant d'installer les dépendances de votre application.

Exemple :

$ echo "6.9.2" > .nvmrc
$ cat .nvmrc
6.9.2

La présence du fichier ”.nvmrc” est prioritaire par rapport à l'utilisation du champ “engines” dans package.json, qui sera ignoré si le fichier existe.

Les binaires Node.js téléchargés avec nvm ne sont pas vérifiés ou supportés par Gandi. Nous vous prions de faire vous-mêmes les validations de stabilité et sécurité que vous jugerez nécessaires.

Package.json

Pour utiliser une des versions de Node.js qui sont pré-installées sur votre instance, il suffit de spécifier dans le fichier “package.json“ la version vous souhaitez utiliser dans le champ “engines“.

Par exemple :

package.json

{
  "name": "website",
  "version": "0.0.1",
  "engines": {
    "node": "6"
  }
}

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

Pour plus d'informations sur les versions actuelles de Node.js, voir https://nodejs.org.

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

MySQL 5.7 (Percona) est disponible pour les nouvelles instances Node.js sur Simple Hosting. Nous supportons également MySQL 5.6 (Percona) et MySQL 5.5 sur les instances existantes.

Vous pouvez vous connecter au service MySQL via son socket Unix, disponible sur /srv/run/mysqld/mysqld.sock. Par défaut, l'utilisateur de la base de données est root et aucun mot-de-passe n'est demandé pour effectuer une connexion locale. Nous vous recommandons de changer ces accès pour des raisons de sûreté. Néanmoins, cela pourra être pratique pour effectuer des tests. A ces fins, vous pouvez également utiliser la base de données default_db, qui est prête à usage.

Vous pourrez ensuite créer autant d'utilisateurs et de bases et données que nécessaire, même si généralement une suffit. Vous n'êtes limité que par l'espace disque disponible sur votre instance, que vous pouvez de toute façon augmenter à tout moment jusqu'à 1 To.

Vous pourrez gérer votre bases de données MySQL avec les outils shell habituels (mysql, mysqldump, etc.) via la console SSH, ou depuis la console web, avec PHPMyAdmin.

Consultez l'article de référence sur l'utilisatio de MySQL sur Simple Hosting pour en savoir davantage.

Voici un exemple d'application permettant de se connecter à la base de données par défaut :

index.js

var http = require('http'),
    mysql = require('mysql');
 
var mysql_conn = mysql.createConnection({
  socketPath: '/srv/run/mysqld/mysqld.sock',
  database: 'default_db',
  user: 'root',
  password: ''
});
 
var test_mysql_conn = function(callback) {
  mysql_conn.connect(function(err) {
    if (err) {
      console.log(err.code);
      if (callback) callback("FAILED");
    } else {
      console.log('connected...');
      if (callback) callback("OK");
    }
  });
  mysql_conn.end();
};
 
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('Hello Node.js!\n');
  test_mysql_conn(function(mysql_status) {
    res.write('MySQL connection: ' + mysql_status + '\n');
    res.end();
  });
}).listen(process.env.PORT);

package.json

{
  "name": "sample-nodejs-mysql-app",
  "version": "1.0.0",
  "description": "Sample Node.js MySQL app for Simple Hosting",
  "main": "index.js",
  "engines": {
    "node": "6"
  },
  "dependencies": {
    "mysql": "*"
  }
}

PostgreSQL

Nous offrons PostgreSQL 9.6 avec Node.js sur les nouvelles instances Simple Hosting. Nous supportons également PostgreSQL 9.4 et PostgreSQL 9.2 sur des instances existantes.

Le service PostgreSQL de votre instance est disponible sur l'hôte localhost, à travers le port 5432. Un utilisateur hosting-db a le droit de se connecter sans mot de passe et d'utiliser la base de données par défaut, appelée postgres. Vous pouvez vous en servir pour effectuer des tests, mais nous vous recommandons de créer des mots de passe robustes pour une utilisation durable.

Vous pouvez créer autant de bases de données et d'utilisateurs dont vous avez besoin, même si normalement un de chaque suffit. Vous n'êtes limité que par l'espace disque disponible sur votre instance, que vous pouvez augmenter à tout moment jusqu'à 1 To.

Vous pouvez gérer votre base de données PostgreSQL avec les outils shell habituels via la console SSH (psql, pg_dump, etc.), ou depuis le panneau de contrôle Web avec phpPgAdmin.

Consultez l'article de référence sur l'utilisation de PostgreSQL sur Simple Hosting pour en savoir plus.

Voici un exemple d'application permettant de tester Node.js avec PostgreSQL sur Simple Hosting :

server.js

var http = require('http'),
    pg = require('pg');
 
var pg_url = "tcp://hosting-db@localhost/postgres";
var pg_conn = new pg.Client(pg_url);
 
var test_pg_conn = function(callback) {
  pg_conn.connect(function(err) {
    if (err) {
      console.log(err);
      if (callback) callback("FAILED");
    } else {
      console.log('Connected to PostgreSQL');
      if (callback) callback("OK");
    }
  });
};
 
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('Hello Node.js!\n');
  test_pg_conn(function(pg_status) {
    res.write('PostgreSQL connection: ' + pg_status + '\n');
    res.end();
  });
}).listen(process.env.PORT);

package.json

{
  "name": "sample-nodejs-pgsql-app",
  "version": "1.0.0",
  "description": "Sample Node.js PostgreSQL app for Simple Hosting",
  "main": "index.js",
  "engines": {
    "node": "6"
  },
  "dependencies": {
    "pg": "*"
  }
}

MongoDB

MongoDB 3.2 est disponible avec Node.js sur les nouvelles instances Simple Hosting. Nous supportons également MongoDB 2.4 sur les instances existantes.

Sur votre instance, le service MongoDB est disponible sur localhost, sur le port 27017. Vous n'aurez pas besoin d'utilisateur ni de mot de passe pour effectuer des tests, mais nous vous recommandons d'en créer pour un usage durable.

Vous pouvez créer autant d'utilisateurs et de bases de données que nécessaire; vous êtes seulement limité par l'espace disque disponible sur votre instance, que nous pouvez augmenter à tout moment, jusqu'à 1 To.

Vous pouvez gérer votre base de données MongoDB avec l'outil mongo via la console SSH , ou depuis le Web avec RockMongo.

Consultez l'article de référence sur l'utilisation de MongoDB sur Simple Hosting pour en savoir davantage.

Voici un exemple d'utilisation de MongoDB avec Node.js sur Simple Hosting:

index.js

var http = require ("http"),
    mongo = require("mongodb");
 
var mongo_url = "mongodb://localhost:27017/sample";
var mongo_conn = mongo.MongoClient;
 
var test_mongo_conn = function(callback) {
  mongo_conn.connect(mongo_url, function(err, db) {
    if (err) {
      console.log(err);
      if (callback) callback("NOT WORKING");
    } else {
      console.log("Connected to server.");  
      if (callback) callback("OK");
    }
    if (db) db.close();
  });
};
 
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('Hello Node.js!\n');
  test_mongo_conn(function(status) {
    res.write('MongoDB connection: ' + status + '\n');
    res.end();
  });
}).listen(process.env.PORT);

package.json

{
  "name": "sample-nodejs-mongodb-app",
  "version": "1.0.0",
  "description": "Sample Node.js MongoDB app for Simple Hosting",
  "main": "index.js",
  "engines": {
    "node": "6"
  },
  "dependencies": {
    "mongodb": "*"
  }
}

Vous trouverez plus d'informations sur l'utilisation de MongoDB avec Node.js sur le site officiel.

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 conseillé de sélectionner d'autres versions 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 16/10/2017 à 13:46 par Alexandre L. (Gandi)