Bağlantı açmak bedava değildir. TCP bir gidiş-dönüşe, TLS bir tanesine daha mal olur; istek ancak ondan sonra yola çıkar. 60 milisaniyelik bir hatta bu, sunucunuza daha hiçbir şey sorulmadan geçen 120 milisaniye demektir — hem de bağlantı başına.

Keep-alive şu demektir: bunu bir kez yap

Keep-alive ile tarayıcı, sonraki yirmi dosya için aynı bağlantıyı yeniden kullanır. Her çağdaş sunucuda varsayılan olarak açıktır; bu yazının büyük ölçüde onu bozmamaya dair olmasının sebebi de budur.

# nginx defaults, and they are sensible
keepalive_timeout 65;
keepalive_requests 1000;

Sizde olduğunu doğrulayın

curl -sSI https://yourdomain.com/ | grep -i -E 'connection|http/'

Durum satırında HTTP/2 ya da HTTP/3 görmek, bağlantının zaten yeniden kullanıldığı ve bunun ayarlamanız gereken bir şey olmadığı anlamına gelir — bkz. HTTP/2 ve HTTP/3. Asıl araştırılması gereken, bir HTTP/1.1 yanıtındaki Connection: close ifadesidir.

Onu bozan üç şey

  • Önde duran ve bağlantıları kendisi kapatan eski bir yük dengeleyici ya da vekil sunucu.
  • Yanlış yapılandırılmış bir upstream bloğu — Nginx'in uygulamanızla keepalive havuzu olmadan konuşması.
  • Varlıkları birbirinden farklı birçok makine adından sunmak; böylece bir sonraki dosya için hiçbir bağlantı yeniden kullanılmaz.
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
}
Yazı tiplerini, resimleri ve betikleri kendi alan adınızdan sunmak artık üçüncü taraf bir sunucudan sunmaktan hızlıdır: aynı bağlantı, fazladan DNS yok, fazladan TLS yok. Varlıkları farklı makine adlarına bölmek HTTP/1.1 dönemine ait bir öğüttü; bugün ise bir maliyettir.