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.