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.