TLDR; J’ai mis en place mon propre CDN basé sur Nginx, optimisé avec Brotli et quelques bonnes pratiques. Résultat : des performances améliorées et un meilleur contrôle sur la gestion de mes assets.

La gestion des fichiers statiques (images, scripts, feuilles de styles) dans mes applications a longtemps été un vrai sujet pour moi. À plusieurs reprises on m'a déconseillé de les déposer dans le gestionnaire de version. C'est pourtant ce que j'ai fait par simplicité. Mais aujourd’hui, j’ai franchi une étape : je suis passé à une solution plus propre et plus performante… un CDN maison.

Le livre qui tout déclenché

Récemment, je suis tombé sur Écoconception web – Les 115 bonnes pratiques de Frédéric Bordage. Dans cet ouvrage, l’auteur, ancien développeur et architecte logiciel, explique comment réduire l’impact environnemental d’un site web en prenant en compte l’ensemble de son cycle de vie : de la conception jusqu’à sa fin de vie, en passant par le développement, la maintenance et l’exploitation.

Couverture du livre Écoconception web - Les 115 bonnes pratiques

L'éco-conception, levier de performance

Au premier abord, on pourrait s’attendre à un discours moralisateur, ou à une invitation à revenir à des sites ultra-sobres dignes du web des années 90. Mais ce n’est pas le cas.

L’approche défendue par Frédéric Bordage repose sur un principe simple : consommer moins de ressources, c’est aussi améliorer les performances... et réduire les coûts. Cela passe par l’optimisation du code, une infrastructure mieux calibrée, et des choix techniques plus pertinents.

Loin d’un discours alarmiste, cette démarche repose sur une réelle expertise technique. L’éco-conception, bien appliquée, n’est pas une contrainte mais dénote d'une qualité supérieure.

Rester critique et adapter

Même si je recommande vivement ce livre, il est important de garder un esprit critique et de contextualiser les recommandations proposées.

Toutes les bonnes pratiques évoquées ne sont pas nécessairement applicables telles quelles. Certaines peuvent même être contre-productives selon votre projet.

Par exemple, l’ouvrage cite G-WAN, un serveur web aux performances impressionnantes, bien supérieures à celles de Nginx. Mais ce qu’il ne précise pas, c’est que G-WAN n’est plus maintenu depuis 2016. Ce genre de détail peut induire en erreur si l’on ne creuse pas un peu.

Mon serveur CDN

Revenons nos moutons. Après la lecture du livre de Frédéric Bordage, j’ai pu établir une liste claire de ce qui me semblait indispensable pour construire un CDN adapté à mes besoins.

Maximiser la mise en cache

Pour éviter que le navigateur du client ne redemande à chaque fois les fichiers statiques (styles, scripts, images…), il est crucial de configurer un cache efficace. Cela permet non seulement de gagner en bande passante, mais aussi d’alléger la charge serveur.

En production, ces fichiers changent rarement. Le principal inconvénient serait qu’un utilisateur doive vider manuellement son cache… ce qui reste gérable (quoique ?).

Pensez donc à ajouter expires max; dans vos directives Nginx pour indiquer une durée de cache très longue.

Compresser les fichiers textes

Toujours dans une optique de réduction du poids des échanges, la compression des fichiers texte (HTML, CSS, JS, JSON, etc.) à la volée est un incontournable.

Deux méthodes sont couramment utilisées : Brotli, plus performante, et Gzip, à défaut.

Voici un exemple de configuration :

# gzip
gzip              on;
gzip_vary         on;
gzip_proxied      any;
gzip_comp_level   6;
gzip_types        text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;

# brotli
brotli            on;
brotli_comp_level 6;
brotli_types      text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;

Si vous avez accès à une version payante de Nginx, l’activation de Brotli est simple. Elle peut se faire via un gestionnaire de paquet classique. Sinon, il faudra le compiler depuis les sources. Le README du dépôt GitHub de Brotli vous guidera, et en cas de doute mon Dockerfile pourra aussi vous servir d'exemple.

💡 Cette compression est encore plus efficace si vous minifiez les fichiers en amont (suppression des commentaires, espaces inutiles…).

Utiliser HTTP/2

La version 2 du protocole HTTP apporte de nombreuses améliorations en matière de performance, notamment grâce au multiplexage.

Pour en savoir plus, je vous recommande cet excellent article sur Zeste de Savoir. Il explique très bien les principes et l’implémentation derrière un reverse proxy.

Dans votre configuration Nginx, vous pouvez l'activer avec la directive http2 on;.

Réduire les logs en production

Les logs sont précieux en développement ou pour diagnostiquer un incident. Mais en production, ils peuvent vite devenir verbeux, peu utiles et consommer des ressources.

L’idée ici est de ne garder que l’essentiel, à savoir les avertissements et erreurs. Exemple de configuration :

access_log off;
error_log /var/log/nginx/error.log warn;

location = /favicon.ico {
    log_not_found off;
}

location = /robots.txt {
    log_not_found off;
}

Supprimer les cookies inutiles

Dans le contexte d’un CDN, les cookies n’ont souvent aucune utilité. Les inclure dans les réponses ne fait qu’augmenter inutilement le poids des requêtes.

Voici comment les supprimer proprement :

proxy_hide_header Set-Cookie;
fastcgi_hide_header Set-Cookie;
add_header Set-Cookie "" always;

Conclusion

Vous pouvez retrouver l’intégralité du projet sur GitHub :

GitHub - CharlyGin/Content-Delivery-Server: Content delivery server
Content delivery server . Contribute to CharlyGin/Content-Delivery-Server development by creating an account on GitHub.

Dépôt Github du projet

Et l’image Docker associée est disponible sur Docker Hub, prête à être utilisée.

Ce projet a été l’occasion idéale pour me replonger dans la configuration Nginx et concevoir une solution adaptée à mes besoins en termes de distribution de contenu.

La lecture des 115 bonnes pratiques m’a ouvert de nouvelles perspectives, et j’ai hâte de continuer à les explorer dans mes prochains projets.

Bien sûr, il reste des pistes d’amélioration, notamment en intégrant des outils comme la minification automatique ou la suppression des métadonnées. Une version 2 plus complète, orientée performance et automatisation, pourrait voir le jour ?

Sources