3 min read

Speed up Ghost

Comment connecter Varnish avec le moteur de blog Ghost ?

Si vous utilisez Ghost comme moteur de blog, vous savez déjà qu’il est plutôt rapide et léger. Mais lorsqu’on veut tirer le maximum de performances, notamment pour encaisser un grand volume de trafic, il est intéressant d’ajouter une couche de cache HTTP devant Ghost.
C’est là qu’intervient Varnish, un accélérateur web très puissant, capable de servir des pages mises en cache en quelques millisecondes.

Dans cet article, nous allons voir comment connecter Varnish avec une instance Ghost locale.


1. Pourquoi utiliser Varnish avec Ghost ?

  • Performance : Varnish réduit drastiquement le temps de réponse en servant directement les pages depuis sa mémoire.
  • Scalabilité : avec un bon cache, Ghost peut gérer des milliers de requêtes sans plier.
  • Flexibilité : vous pouvez définir tes règles de cache (durée, exceptions, purges…).
  • Protection : Varnish absorbe une partie du trafic et protège Ghost des surcharges.

2. Schéma d’architecture

L’architecture typique avec Varnish est la suivante :

[Client] → [Varnish Cache] → [Ghost (Node.js)] → [Base de données]

Le client ne contacte jamais directement Ghost. Toutes les requêtes passent d’abord par Varnish, qui décide s’il peut répondre depuis son cache ou s’il doit interroger Ghost.


3. Pré-requis

  • Un serveur avec Ghost installé (npm dans mon cas, mais fonctionne également avec docker)
  • Varnish installé sur la même machine ou en frontal (Debian dans mon cas).
apt install varnish
  • Ghost configuré pour tourner sur un port interne (par ex. 127.0.0.1:2368).

4. Configurer Ghost pour Varnish

Par défaut, Ghost écoute sur http://127.0.0.1:2368.
Vous n’avez rien à modifier, mais assurez-vous que le fichier config.production.json a bien :

{
  "url": "https://votre-domaine.com",
  "server": {
    "host": "127.0.0.1",
    "port": 2368
  }
}

L’URL publique doit pointer vers votre domaine, car c’est ce que Varnish servira.


5. Configurer Varnish

Un fichier de configuration VCL (/etc/varnish/default.vcl) pourrait ressembler à ceci :

vcl 4.1;

backend default {
    .host = "127.0.0.1";
    .port = "2368";
}

sub vcl_recv {
    # Ne pas mettre en cache l’admin Ghost
    if (req.url ~ "^/ghost/") {
        return (pass);
    }

    # Ne pas mettre en cache l’API Ghost
    if (req.url ~ "^/ghost/api/") {
        return (pass);
    }

    # Forcer le cache pour le reste
    if (req.method == "GET" || req.method == "HEAD") {
        return (hash);
    }
}

sub vcl_backend_response {
    # Cache les pages HTML pendant 2 minutes
    if (beresp.ttl <= 0s) {
        set beresp.ttl = 120s;
    }

    # Ne pas mettre en cache les réponses de type admin ou API
    if (bereq.url ~ "^/ghost/") {
        set beresp.ttl = 0s;
        return (deliver);
    }
}

Éditez le fichier (/lib/systemd/system/varnish.service)

[Unit]
Description=Varnish Cache, a high-performance HTTP accelerator
Documentation=https://www.varnish-cache.org/docs/ man:varnishd

[Service]
Type=simple

# Maximum number of open files (for ulimit -n)
LimitNOFILE=131072

# Locked shared memory - should suffice to lock the shared memory log
# (varnishd -l argument)
# Default log size is 80MB vsl + 1M vsm + header -> 82MB
# unit is bytes
LimitMEMLOCK=85983232
ExecStart=/usr/sbin/varnishd \
          -j unix,user=vcache \
          -F \
          -a :6081 \
          -T localhost:6082 \
          -f /etc/varnish/default.vcl \
          -S /etc/varnish/secret \
          -s malloc,256m
ExecReload=/usr/share/varnish/varnishreload
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
PrivateDevices=true

[Install]
WantedBy=multi-user.target

6. Lancer Varnish et Reconfigurez Nginx

Pour lancer Varnish sur le port 6081 et rediriger vers Ghost :

sudo systemctl start  varnish
sudo systemctl enable  varnish

Reconfigurer Nginx pour pointer sur le port Varnish (6081)

server {
    listen 80;
    server_name www.fondation-phoenix.fr;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
	    #proxy_pass http://127.0.0.1:2368;
        proxy_pass http://127.0.0.1:6081;
	}
}

7. Tester

  1. Redémarre Varnish et Nginx
  2. Va sur https://votre-domaine.com.
  3. Vérifie les en-têtes HTTP pour confirmer que Varnish fonctionne :
curl -I https://votre-domaine.com

Tu devrais voir un en-tête similaire à :

X-Varnish: 32790
Via: 1.1 varnish (Varnish/7.3)

8. Conclusion

En ajoutant Varnish devant Ghost, vous profitez d’un cache HTTP haute performance qui réduit la charge serveur et accélère votre blog.
Il est possible d’aller encore plus loin en configurant des règles de purge et en monitorant les performances avec varnishstat.

A+