/ ghost

Ghost + Nginx : how to

Comme vous le savez déjà ce site à été migré de Wordpress vers Ghost.

Ghost est un CMS écrit en NodeJS et qui se concentre un maximum sur ce qui fait le blog : le contenu.

Il est donc beaucoup plus léger et réactif qu'un CMS traditionnel tel que Wordpress. Voici comment je l'ai mis en place sur mon serveur.

Installation de Ghost

L'installation de Ghost est très simple. Je ne vais pas vous réécrire la documentation ici. Elle est très bien faite et vous permettra rapidement d'avoir un site Ghost fonctionnel.

Comme dit à la fin de la documentation, il ne vous reste plus qu'à aller sur http://<your-ip-address>:2368/ghost pour accéder à l'admin.

Lors de votre première connexion vous devrez créer votre compte.

Nginx en reverse proxy

Vous vous demandez peut-être pourquoi Ghost écoute par défaut sur le port 2368 de votre serveur et non sur le port 80 comme tous les autres nginx, apache et concerts..

Lorsque vous développez en NodeJS vous partez presque de zéro. Même si le langage ne l'est pas, la plateforme et les library standard de NodeJS sont très bas niveaux.

Vous développez presque tout seul votre serveur HTTP. Beaucoup d'aspects du traitement des requêtes, dont une bonne partie de la sécurité, sont laissés à votre charge. Les applications NodeJS possèdent donc potentiellement des failles de sécurité.

Autre fait, les programmes écoutant les ports entre 0 et 1024 doivent être lancés avec un utilisateur "sudoer" (root par exemple).

En combinant les deux informations, vous vous imaginez facilement qu'une application mal codée devant être lancée en sudoer pour écouter sur le port 80 représente une très très grosse faille de sécurité pour tout votre serveur.

Une solution consiste à utiliser Apache ou Nginx en tant que reverse proxy. Dans cet article ce sera Nginx.

Nous allons donc demander à Nginx d'écouter sur le port 80 et de rediriger le flux HTTP vers l'application NodeJS qui écoute sur un port supérieur à 1024 pour qu'elle la traite.

L'application NodeJS (ici Ghost) n'a pas besoin d'être exécuté avec un utilisateur sudoer. Cela n'enlève pas les faille de sécurité de l'application mais si jamais une faille est exploitée elle ne donnera pas aussi facilement un accès privilégié à la machine hôte.

Comment on fait ça ?

Voici en substance le script de configuration qui permet de faire fonctionner Ghost avec Nginx :

server {
    listen 80;
    server_name <domain>;
    
    location / {
        max_ranges 0;

        proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
        proxy_set_header   Host      		$http_host;
        proxy_set_header   X-Forwarded-Proto    $scheme;
        proxy_pass         http://127.0.0.1:2368;
    }
    
    access_log /var/log/nginx/<domain>.log;
    client_max_body_size 3m;
}

Nginx écoute sur le port 80 ; pour toutes les routes du domaine <domaine> il redirige vers le port 2368. Là où écoute Ghost.


Tweetez moi si vous avez des questions ou des remarques. Et bien-sûr, n'hésitez pas à partager si vous avez aimé cet article.