Ouvrir une connexion n'est pas gratuit. TCP coûte un aller-retour, TLS un autre, et c'est seulement ensuite que la requête part. Sur un lien à 60 ms, cela fait 120 ms écoulées avant qu'on ait demandé quoi que ce soit à votre serveur — par connexion.
Keep-alive veut dire : faites-le une seule fois
Avec le keep-alive, le navigateur réutilise la même connexion pour les vingt fichiers suivants. C'est activé par défaut sur tout serveur moderne, et c'est pourquoi cet article parle surtout de ne pas le casser.
# nginx defaults, and they are sensible
keepalive_timeout 65;
keepalive_requests 1000;
Vérifiez que vous l'avez
curl -sSI https://yourdomain.com/ | grep -i -E 'connection|http/'
HTTP/2 ou HTTP/3 dans la ligne de statut signifie que la réutilisation a déjà lieu et que vous n'avez rien à configurer — voir HTTP/2 et HTTP/3. C'est Connection: close sur une réponse HTTP/1.1 qui mérite une enquête.
Les trois choses qui le cassent
- Un vieux répartiteur de charge ou proxy en amont qui ferme lui-même les connexions.
- Un bloc upstream mal configuré — Nginx qui parle à votre application sans pool keepalive.
- Servir les ressources depuis de nombreux noms d'hôtes différents, si bien qu'aucune connexion n'est réutilisée pour le fichier suivant.
upstream app {
server 127.0.0.1:9000;
keepalive 32; # the pool Nginx keeps open to your app
}
location / {
proxy_http_version 1.1;
proxy_set_header Connection ""; # required, or the pool is not used
}
Servir polices, images et scripts depuis votre propre domaine est aujourd'hui plus rapide que depuis un hôte tiers : même connexion, pas de DNS supplémentaire, pas de TLS supplémentaire. Éparpiller les ressources sur plusieurs noms d'hôtes était un conseil pour HTTP/1.1 ; c'est aujourd'hui un coût.