Un front pour un Node

Vous découvrez mon nouveau blog qui n'est plus chez Overblog mais hébergé sur mon serveur dédié avec le nouvel outil de bloging libre et open source : Ghost. Non, ça n'a aucun rapport avec mon départ de la société Overblog. C'est juste parce que c'est une app en Node.js et que j'aime Node.js.

Lors de l'installation de l'application, j'ai été emmené à découvrir un truc qui m'interloquait depuis des années, mais auquel je n'avais pas encore été confronté : la question du port de communication d'une app Node.js. En effet, le port 80 appartient à Root et il est donc impossible de lancer une app Node.js répondant au port par défaut du web sans le lancer en Root, chose absolument déconseillée évidemment. Et bien, voilà la solution, expliquée vaguement dans la doc de Ghost. Après la théorie, je vous expliquerais comment configurer un serveur Cherokee (je suis définitivement une saloperie de hipster), la doc de Ghost expliquant déjà comment configurer un Nginx. Et pour finir, nous tweakerons ce serveur pour cacher au maximum les données provenant des pages publiques du blog, sans toucher aux pages du backoffice.

Port, salut !

Alors voilà. Quand on interroge une URL sans spécifier de port, c'est celui du protocole qui est utilisé par défaut. Pour le web, il s'agit du port 80. Si j'interroge l'URL http://blog.hadrien.eu, alors c'est le port 80 qui répondra sur mon serveur. Par contre, si j'interroge http://blog.hadrien.eu:2368, c'est le port 2368 qui répondra. Je ne vous apprend évidemment rien. Mais pourquoi je vous parle de ça ?

Sur un système Unix (Linux, BSD, etc), les ports inférieurs à 1024, dont le port 80, appartiennent à l'utilisateur Root. Cet utilisateur ayant tous les droits, il est évidemment inconcevable de lancer une application Node en Root juste pour lui permettre d'écouter le port 80 et on lui fait donc écouter un port supérieur à 1024. Celui de Ghost étant le 2368. Mais dire aux gens que son blog est à http://blog.hadrien.eu:2368, c'est pas terrible. Ça serait pas mal de trouver une solution pour qu'il réponde au port 80 sans pour autant compromettre la sécurité.

HTTP PROXY

La solution, c'est de passer par un serveur frontal en guise de load balancer qui répondra au port 80 et qui fera transiter les données entre le client et l'app Node.js. À notre échelle, ça ne servira qu'à ça et aussi à mettre en place un système de cache, mais à une plus grande échelle, cela peut aussi permettre de répartir la charge sur plusieurs serveurs et de faciliter la scalabilité du système.

L'application Node est donc configurée pour ne répondre qu'aux connexion provenant de localhost (dans notre cas simple où l'app et le frontal sont sur le même serveur) ou provenant du serveur frontal. Il est donc impossible d'interroger l'app depuis l'extérieur.

Le frontal peut être n'importe quel serveur web sachant pratiquer le http-proxying : Apache, déconseillé par sa lourdeur, Nginx, Varnish, ou Cherokee sont quelques exemples. Le principe est donc de configurer un VHost sur ce serveur et lui dire de faire transiter les données vers localhost:2368. Voilà comment on fait répondre un serveur au port 80 tout en ayant une app lancée par un utilisateur restreint sur un post différent.

Tweakons Cherokee

Cherokee est un serveur web complet visant à remplacer Apache. Il a la réputation d'être très rapide et beaucoup moins lourd que Apache. Il est évidemment moins performant qu'nginx mais il est plus polyvalent et surtout bien plus simple à configurer. Bref, c'est avec ça que je sers mes sites persos sur mon serveur dédié, et c'est donc avec lui qu'on va tweaker l'installation de Ghost.

Source

La première chose à faire est d'indiquer à Cherokee la sources des données de Ghost. Pour cela, nous nous rendons dans la partie Sources et nous en ajoutons une nouvelle que nous configurons comme Hôte distant. Nous lui donnons un joli surnom original comme par exemple "Ghost", et nous lui spécifions l'URL où Ghost est sensé répondre, à savoir, http://localhost:2368 par défaut.

Source Ghost

vServer

Ensuite, nous allons créer un serveur virtuel répondant au domaine qui nous intérresse. Je ne vous ferais pas l'affront de vous rapeller que votre domaine doit bien évidemment être configurer pour pointer sur votre serveur…

Créons donc un nouveau serveur virtuel avec pour unique information pertinente, le domaine dédié en guise de surnom. Bon Cherokee risque de vous embetter en vous réclamant absolument une racine de documents. Mettez lui n'importe quoi où simplement le chemin où est située votre install de Ghost. C'est pas très important. Ce qui est important, c'est la suite :

vServer Ghost

Behavior

Vous allez vous rendre dans la partie Behavior de votre vServer et modifier le comportement par défaut. Vous pouvez même supprimer les autres règles, on n'a besoin que de celle par défaut pour le moment.

Nous allons choisir le gestionnaire HTTP reverse proxy et tout en bas de la page de config, nous choisissons un load balancer Round Robin, et surtout la source d'informations que nous avons précédemment créée : Ghost.

HTTP reverse proxy

À partir de là, vous pouvez sauvegarder et redémarrer gracieusement votre serveur et constater que ça marche. Mais ce n'est pas fini !

Tweaking

Dans les onglets Transforms et Caching, vous allez activer tout ce qui vous permettra de gagner en performance : GZIP, Deflate, cache maximum. Avec ça, vous êtes paré pour le buzz !

Par contre, vous allez être embetés en vous rendant sur votre admin car les pages dynamiques aussi vont être cachées. Flute et crotte.

Créons un nouveau Behavior, manuel, de type expression régulière. L'expression régulière à matcher est :

/(ghost|api)*

Ça veut dire que nous allons définir un comportement spécifique pour toutes les requêtes commençant par /ghost et /api, c'est à dire, les URL du backoffice.

Et bien, c'est très simple, c'est la même configuration que précédemment, sauf que vous enlever toutes les options de cache. Et c'est tout.

Voilà, c'était un long article qui ne risque pas d'interresser les foules mais qui m'aura au moins permis de bien expérimenter l'éditeur de posts de Ghost.

Hadrien

Hi, I'm a french Javascript Lead Developer, Web Architect from Toulouse, France. I've worked for 12 years for many projects with YUI, AngularJS, Aurelia.io and now React and React native.

Toulouse, France https://hadrien.eu