Eine Verbindung zu öffnen ist nicht umsonst. TCP kostet einen Roundtrip, TLS noch einen, und erst danach geht die Anfrage hinaus. Auf einer Leitung mit 60 ms sind das 120 ms, die vergehen, bevor Ihr Server überhaupt gefragt wurde — pro Verbindung.
Keep-alive heißt: tu das einmal
Mit Keep-alive verwendet der Browser dieselbe Verbindung für die nächsten zwanzig Dateien weiter. In jedem modernen Server ist es voreingestellt an — deshalb handelt dieser Artikel vor allem davon, es nicht kaputtzumachen.
# nginx defaults, and they are sensible
keepalive_timeout 65;
keepalive_requests 1000;
Prüfen, ob Sie es haben
curl -sSI https://yourdomain.com/ | grep -i -E 'connection|http/'
HTTP/2 oder HTTP/3 in der Statuszeile heißt, dass Verbindungen bereits wiederverwendet werden und Sie dafür nichts einstellen müssen — siehe HTTP/2 und HTTP/3. Connection: close bei einer HTTP/1.1-Antwort ist das, dem Sie nachgehen sollten.
Die drei Dinge, die es kaputtmachen
- Ein alter Loadbalancer oder Proxy davor, der Verbindungen selbst schließt.
- Ein falsch eingerichteter upstream-Block — Nginx spricht mit Ihrer Anwendung ohne Keepalive-Pool.
- Assets von vielen verschiedenen Hostnamen auszuliefern, sodass für die nächste Datei keine Verbindung wiederverwendet wird.
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
}
Schriften, Bilder und Skripte von Ihrer eigenen Domain auszuliefern ist heute schneller als von einem fremden Host: dieselbe Verbindung, kein zusätzliches DNS, kein zusätzliches TLS. Assets über mehrere Hostnamen zu verteilen war ein Rat für HTTP/1.1 und ist heute ein Kostenpunkt.