Quand je dois optimiser la latence d’une application web en production, j’adopte une approche pragmatique et mesurable : mesurer d’abord, corriger les plus gros goulets d’étranglement, et automatiser pour que les gains tiennent dans la durée. Dans mes projets récents j’ai combiné nginx en tant que reverse-proxy/terminaison TLS, Cloudflare pour la distribution au bord et la sécurité, et Varnish pour le cache applicatif hautes performances. Voici mon retour d’expérience concret, avec des configurations et des checks faciles à appliquer.
Mesurer avant d’agir
On ne peut pas améliorer ce qu’on ne mesure pas. Mes indicateurs favoris :
Outils que j’utilise quotidiennement : curl -I, wrk, hey, WebPageTest, Lighthouse et les métriques côté serveur (Prometheus + Grafana). Un exemple rapide pour mesurer le TTFB :
curl -w "@curl-format.txt" -o /dev/null -s https://www.monsite.fr/
Mon fichier curl-format.txt contient des timings utiles comme %{time_starttransfer} qui correspond au TTFB.
Architecture cible : nginx + Varnish + Cloudflare
Voici l’idée générale que j’applique :
Avantages : Cloudflare réduit la distance physique, Varnish gère les règles de cache complexes et la purge fine, nginx assure la terminaison TLS, les en-têtes et la compression.
Configurer Cloudflare pour réduire la latence
Astuce : utilisez les Origin Certificates de Cloudflare pour sécuriser la connexion Cloudflare → origine sans exposer un certificat public — cela simplifie la terminaison TLS côté serveur.
nginx : réglages pratiques
Quand nginx est exposé ou qu’il est le reverse-proxy entre Cloudflare et Varnish, voici mes optimisations clés :
keepalive_timeout 65;client_body_buffer_size 16K; et client_max_body_size selon vos besoinssendfile on; tcp_nopush on; tcp_nodelay on;Exemple simplifié (bloc http) :
sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; gzip on; gzip_types text/plain application/json text/css application/javascript;
Varnish : mise en cache applicatif efficace
Varnish est excellent pour réduire la charge applicative et baisser le TTFB quand on sert beaucoup de contenu dynamique mais cacheable.
grace pour servir du contenu légèrement expiré en cas de problématique backend (stale-while-revalidate)varnishstatExemple VCL simple :
sub vcl_recv { if (req.url ~ "^/api/") { return (pass); } else { return (hash); } }sub vcl_backend_response { set beresp.ttl = 10m; set beresp.grace = 1h; }
Headers et politique de cache
Les headers contrôlent le comportement du cache :
Un exemple d’en-tête pour une page coté serveur :
Cache-Control: public, max-age=60, s-maxage=600, stale-while-revalidate=30
Stratégies de purge et invalidation
Purger tout le cache est tentant mais coûteux. J’utilise :
Optimisations réseau et TLS
Métriques & Monitoring continus
Après avoir appliqué les optimisations, je configure des dashboards qui suivent :
Quelques commandes utiles :
varnishstat — pour voir hit/missvarnishlog — pour debugcurl -I -H "Cache-Control: no-cache" — pour forcer un bypass et tester l’origineQuelques pièges à éviter
Cas pratique rapide
Sur un projet e‑commerce, en combinant :
| Avant | Après |
| TTFB moyen 450ms | TTFB moyen 90ms |
| Charge CPU backend élevée | Backend réduit de 70% de charge |
| Cache hit 15% | Cache hit 85% (Cloudflare + Varnish) |
Les actions : mise en place de Varnish avec surrogate-keys, configuration Cloudflare “Cache everything” pour pages standards, optimisation nginx (keepalive, sendfile) et compression Brotli. Mes clients ont senti la différence, surtout sur les pages produits très visitées.
Si vous voulez, je peux vous fournir des snippets de configuration plus détaillés (nginx.conf, vcl.vcl) adaptés à votre architecture, ou vous guider pour intégrer la purge automatique dans votre CI/CD. Dites-moi quelle stack exacte vous utilisez et je vous envoie des exemples personnalisés.