Teknoloji ipuçlarını kendin uygula
İçerik
Son yazılar
Biz kimiz
Ağ, bulut ve sistem yönetimi konularında pratik rehberler. Adım adım açıklamalar ve gerçek sorunlara çözümler sunuyoruz.

HTTP/2 Protokolü ile Web Sunucusu Hızlandırılması

Sunucularımdan birinde sayfa açılış süresini bir türlü aşağı çekemediğim bir dönem yaşadım. Görselleri sıkıştırdım, önbellek başlıklarını ayarladım, hatta CDN denedim; yine de tarayıcı ağ sekmesinde onlarca istek sıraya girip birbirini bekliyordu. Sorun dosyalarda değil, protokoldeydi: sunucu hâlâ HTTP/1.1 konuşuyordu. HTTP/2'yi açtıktan sonra aynı sayfa, hiçbir dosyaya dokunmadan belirgin biçimde hızlandı. Aşağıda kendi kurulumumda izlediğim yolu adım adım anlatıyorum.

HTTP/2 neyi değiştiriyor?

HTTP/1.1'de tarayıcı, bir bağlantı üzerinden tek seferde tek istek yapabiliyor. Bu yüzden tarayıcılar aynı sunucuya 6 civarında paralel bağlantı açıp geri kalan her şeyi kuyruğa alıyor. HTTP/2 ise tek bağlantı üzerinden çoklama (multiplexing) yapıyor: CSS, JS, font ve görseller aynı bağlantıda iç içe akıyor. Buna ek olarak başlıklar HPACK ile sıkıştırılıyor, veri metin yerine ikili çerçeveler hâlinde taşınıyor ve isteklere öncelik atanabiliyor. Yani kazanç dosya boyutundan değil, bekleme süresinin ortadan kalkmasından geliyor.

Adım adım HTTP2 sunucu ayarları

  1. Önce HTTPS'i halledin. Tarayıcıların tamamı HTTP/2'yi yalnızca TLS üzerinden kabul ediyor. Sertifikanız yoksa HTTP/2 ayarını yazsanız da istekler HTTP/1.1'e düşer. Ücretsiz sertifika almak için Let's Encrypt anlatımındaki adımları uygulayabilirsiniz; benim tüm sunucularımda kullandığım yöntem bu.

  2. Sürümleri kontrol edin. HTTP/2, TLS el sıkışması sırasında ALPN uzantısıyla pazarlık yapıyor. Bu da OpenSSL 1.0.2 ve üzerini gerektiriyor. Sunucuya SSH ile bağlanıp nginx -V veya apachectl -V çıktısında derlendiği OpenSSL sürümünü görebilirsiniz. Çok eski bir dağıtım kullanıyorsanız önce paketleri güncellemek gerekir.

  3. Nginx'te etkinleştirin. Yeni sürümlerde ayar sunucu bloğunda ayrı bir satır olarak duruyor: listen 443 ssl; satırının altına http2 on; yazmak yeterli. Daha eski sürümlerde ise klasik biçim geçerli: listen 443 ssl http2;. Aynı sertifikayı paylaşan birden fazla sanal sunucunuz varsa hepsine eklemeyi unutmayın, çünkü ilk eşleşen blok protokolü belirliyor.

  4. Apache'de modülü açın. a2enmod http2 komutuyla modülü etkinleştirip yapılandırmaya Protocols h2 http/1.1 satırını ekliyorum. Burada gözden kaçan kritik nokta şu: Apache'nin varsayılan prefork MPM'i HTTP/2 ile çalışmıyor. event MPM'e geçip PHP'yi mod_php yerine PHP-FPM üzerinden çalıştırmanız gerekiyor. Bu geçişi yapmadan modülü açtığımda hiçbir şey değişmemişti, bir saatimi buna harcadım.

  5. Yapılandırmayı sınayıp yeniden yükleyin. Nginx'te nginx -t, Apache'de apachectl configtest ile söz dizimini doğrulayın. Sorun yoksa servisi tamamen yeniden başlatmak yerine reload edin; açık bağlantılar kopmadan yeni ayar devreye girer.

  6. Gerçekten çalıştığını doğrulayın. En hızlı yöntem komut satırından curl -I --http2 https://siteniz.com çalıştırmak. Yanıtın ilk satırında HTTP/2 200 görüyorsanız iş tamam. Tarayıcı tarafında ise geliştirici araçlarının ağ sekmesine sağ tıklayıp "Protocol" kolonunu açın; her satırda h2 yazmalı. Bazı isteklerde hâlâ http/1.1 görüyorsanız o kaynaklar başka bir alan adından, muhtemelen HTTP/2 desteği olmayan bir üçüncü taraf sunucudan geliyor.

  7. HTTP/1.1 dönemine ait hileleri geri alın. Bu adım en çok atlanan ama en çok fark yaratan kısım. Bağlantı sayısı sınırını aşmak için yaptığımız numaralar artık zararlı: farklı alt alan adlarına dağıtılmış statik dosyalar (domain sharding), dev CSS sprite'ları, onlarca dosyanın tek bir devasa bundle'a paketlenmesi ve base64 ile HTML içine gömülen görseller. HTTP/2'de bunları bölmek daha iyi sonuç veriyor, çünkü küçük dosyalar ayrı ayrı önbelleklenebiliyor ve zaten paralel iniyor.

  8. İnce ayarları yapın. Tek bağlantı üzerinden çalıştığınız için keepalive_timeout değerini çok kısa tutmayın. TLS 1.3'ü açmak el sıkışmayı kısaltır. Nginx'te ssl_session_cache shared:SSL:10m; gibi bir oturum önbelleği tekrar bağlanmaları hızlandırır. İsteğe bağlı olarak http2_max_concurrent_streams değerini kurcalayabilirsiniz ama varsayılan çoğu site için fazlasıyla yeterli.

Sık yapılan hatalar