Uzun yıllar boyunca HTTP/1.1, web’in omurgası olarak hizmet verdi. Ama işin gerçeği şu: 1997’de tasarlanan bir protokol, 2024’ün web uygulamalarının ihtiyaçlarını karşılamakta zorlanıyor. Bir modern web sayfası ortalama 70-100 arasında istek gönderiyor tarayıcıya. HTTP/1.1 ile her biri sırayla işleniyor, bağlantılar kuyruğa giriyor, head-of-line blocking denen o meşhur sorun baş gösteriyor. HTTP/2 tam olarak bu noktada devreye giriyor ve Apache üzerinde aktifleştirmesi sandığınızdan çok daha kolay.
HTTP/2’nin Getirdikleri: Neden Geçiş Yapmalısın?
Teknik detaylara girmeden önce, HTTP/2’nin pratik hayatta ne anlama geldiğini konuşalım. Production ortamında Apache çalıştıran bir sysadmin olarak şunları göreceksin:
- Multiplexing: Tek bir TCP bağlantısı üzerinden birden fazla istek eş zamanlı işleniyor. HTTP/1.1’in “sıra bekle” anlayışı tarihe karışıyor.
- Header Compression (HPACK): Her istekte aynı header’ları tekrar tekrar göndermek yerine, HPACK algoritması bunları sıkıştırıyor. Özellikle cookie-heavy uygulamalarda ciddi bant genişliği tasarrufu sağlıyor.
- Server Push: Sunucu, istemci henüz istemeden kaynakları önceden gönderebiliyor. CSS, JavaScript, kritik resimler için kullanışlı.
- Binary Framing: HTTP/1.1 text tabanlıydı, HTTP/2 binary. Parse etmesi daha hızlı, hata oranı daha düşük.
- Stream Prioritization: Tarayıcı hangi kaynağın önce gelmesi gerektiğini söyleyebiliyor.
Gerçek dünyadan bir örnek: Orta büyüklükte bir e-ticaret sitesinde HTTP/2’ye geçtikten sonra sayfa yükleme süresinin %25-40 oranında düştüğünü görmek mümkün. Bu doğrudan bounce rate ve dönüşüm oranına yansıyor.
Ön Koşullar: Neye İhtiyacın Var?
HTTP/2’yi Apache üzerinde aktifleştirmek için birkaç şeyin yerli yerinde olması gerekiyor.
Apache Versiyonu: Apache 2.4.17 ve üzeri mod_http2 modülünü destekliyor. Versiyonunu kontrol et:
apache2 -v
# veya
httpd -v
SSL/TLS Zorunluluğu: Teknik olarak HTTP/2’nin cleartext (h2c) versiyonu da var ama pratikte tüm modern tarayıcılar HTTP/2’yi sadece TLS üzerinden destekliyor. Yani SSL sertifikan olması şart. Let’s Encrypt kullanıyorsan zaten hazırsın.
OpenSSL Versiyonu: TLS 1.2 minimum, TLS 1.3 ise ideal. OpenSSL 1.0.2 ve üzeri gerekli:
openssl version
mod_http2 Modülü: Ubuntu/Debian sistemlerde genellikle apache2 paketi ile geliyor ama aktif edilmiş olmayabilir. CentOS/RHEL tarafında ise mod_http2 ayrı paket olarak gelebilir:
# Yüklü modülleri listele
apache2ctl -M | grep http2
# Ubuntu/Debian için modülü etkinleştir
a2enmod http2
# Mevcut modülleri kontrol et
ls /etc/apache2/mods-enabled/
Kurulum: Ubuntu/Debian Üzerinde Adım Adım
Ubuntu 20.04/22.04 ve Debian 10/11 için süreç oldukça doğrudan:
# Önce Apache versiyonunu kontrol et
apache2 -v
# mod_http2 etkinleştir
sudo a2enmod http2
# SSL modülünün de aktif olduğundan emin ol
sudo a2enmod ssl
# Apache'yi yeniden başlat
sudo systemctl restart apache2
# HTTP/2 modülünün yüklendiğini doğrula
apache2ctl -M | grep http2
# Çıktı: http2_module (shared) görmelisin
Eğer apache2ctl -M | grep http2 sonucunda hiçbir şey görünmüyorsa, modül düzgün yüklenmemiş demektir. Bu durumda:
# libapache2-mod-http2 paketini yükle (bazı sistemlerde ayrı geliyor)
sudo apt install libapache2-mod-http2
sudo a2enmod http2
sudo systemctl restart apache2
CentOS/RHEL/AlmaLinux Üzerinde Kurulum
Red Hat tabanlı sistemlerde biraz farklı:
# Apache versiyonunu kontrol et
httpd -v
# mod_http2 genellikle httpd paketine dahil gelir
# Ama eksikse:
sudo yum install mod_http2
# veya RHEL 8+ için:
sudo dnf install mod_http2
# Modül yapılandırma dosyasını kontrol et
cat /etc/httpd/conf.modules.d/10-h2.conf
# Apache'yi yeniden başlat
sudo systemctl restart httpd
# Kontrol et
httpd -M | grep http2
Virtual Host Yapılandırması
Modülü aktifleştirmek yeterli değil. Virtual host seviyesinde de HTTP/2’yi açman gerekiyor. İşte temel bir yapılandırma:
# /etc/apache2/sites-available/senin-siteni.conf
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com
# HTTP/2 protokolünü etkinleştir
Protocols h2 http/1.1
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# Modern TLS yapılandırması
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off
ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined
</VirtualHost>
# HTTP'den HTTPS'e yönlendirme
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
Burada kritik satır: Protocols h2 http/1.1. Bu direktif Apache’ye “önce h2 dene, olmadıysa http/1.1’e dön” diyor. Sıralamanın önemi var, h2 her zaman önce gelmeli.
Global olarak tüm siteler için aktifleştirmek istiyorsan, apache2.conf veya httpd.conf dosyasına da ekleyebilirsin:
# Global yapılandırma dosyasını düzenle
sudo nano /etc/apache2/apache2.conf
# Dosyanın uygun bir yerine ekle:
Protocols h2 http/1.1
H2Direct on
HTTP/2’yi Test Etme ve Doğrulama
Yapılandırmayı kaydedip Apache’yi yeniden başlattıktan sonra gerçekten çalışıp çalışmadığını test etmen gerekiyor.
# Apache yapılandırmasını syntax kontrolü
sudo apache2ctl configtest
# Çıktı: Syntax OK olmalı
# Apache'yi yeniden yükle
sudo systemctl reload apache2
# curl ile HTTP/2 testi
curl -I --http2 https://example.com
# Yanıt başlığında "HTTP/2 200" görmelisin
# Daha detaylı curl çıktısı
curl -v --http2 https://example.com 2>&1 | grep -E "HTTP/2|ALPN|protocol"
OpenSSL ile de kontrol edebilirsin:
# ALPN müzakeresini test et
openssl s_client -connect example.com:443 -alpn h2 2>/dev/null | grep ALPN
# Çıktı: ALPN protocol: h2 görmelisin
Tarayıcı tarafında Chrome DevTools kullanarak da kontrol edebilirsin: Network sekmesine git, isteklerden birinin üzerine sağ tıkla, “Protocol” sütununu ekle. “h2” görüyorsan HTTP/2 çalışıyor demektir.
mod_http2 Performans Ayarları
HTTP/2’yi aktifleştirmek başlangıç. Ama doğru ayarlamadan performans beklentilerini karşılamayabilir. İşte önemli direktifler:
# HTTP/2 performans yapılandırması
<VirtualHost *:443>
ServerName example.com
Protocols h2 http/1.1
# Eş zamanlı stream sayısı (varsayılan: 100)
H2MaxSessionStreams 100
# Push promise için timeout (ms)
H2PushPriority * after 32
H2PushDiarySize 256
# Window boyutu - yüksek bant genişliğinde artır
H2InitialWindowSize 65535
# Worker thread sayısı
H2MinWorkers 10
H2MaxWorkers 75
# Boşta bekleme süresi (saniye)
H2MaxWorkerIdleSeconds 600
# Direct bağlantı (TLS ALPN olmadan HTTP/2)
H2Direct on
# Header compression tablosu boyutu
H2TLSWarmUpSize 0
H2TLSCoolDownSecs 1
SSLEngine on
# ... SSL yapılandırması devam eder
</VirtualHost>
H2MaxSessionStreams: Tek bir bağlantıda açılabilecek maksimum stream sayısı. Çok sayıda eş zamanlı kullanıcısı olan sitelerde 200-300’e çıkarabilirsin ama sunucu kaynaklarını göz önünde bulundur.
H2MinWorkers ve H2MaxWorkers: HTTP/2 isteklerini işleyecek worker thread sayısı. Bu değerleri sunucunun CPU çekirdek sayısına göre ayarla. Genel kural: min = CPU çekirdeği x 2, max = CPU çekirdeği x 25.
MPM Seçimi: Event MPM Zorunluluğu
Bu kısım çok önemli ve sık atlanan bir detay. HTTP/2, Apache’nin event MPM ile çalışmasını gerektiriyor. prefork MPM ile HTTP/2 çalışmıyor, çünkü prefork process-based model HTTP/2’nin asenkron yapısıyla uyumsuz.
# Aktif MPM'i kontrol et
apache2ctl -V | grep MPM
# veya
apache2ctl -M | grep mpm
# prefork görüyorsan, event'e geçmen gerekiyor
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo systemctl restart apache2
Ama dikkat: PHP kullanıyorsan, mod_php prefork MPM gerektirir! Bu durumda PHP-FPM’e geçmen gerekiyor. Bu aslında zaten iyi bir uygulama ama geçiş planını dikkatlice yapman lazım.
# PHP-FPM kurulumu (Ubuntu için)
sudo apt install php8.1-fpm
# mod_php yerine FastCGI proxy kullan
sudo a2dismod php8.1
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.1-fpm
sudo systemctl restart apache2
Server Push: Akıllıca Kullanım
HTTP/2 Server Push, sunucunun tarayıcı istemeden kritik kaynakları önceden göndermesini sağlıyor. Ama dikkatli kullanmazsan fayda yerine zarar verebilir. Tarayıcının zaten cache’inde olan dosyaları push etmek gereksiz bant genişliği tüketiyor.
<VirtualHost *:443>
ServerName example.com
Protocols h2 http/1.1
# Ana CSS dosyasını push et
<Location /index.html>
Header add Link "</css/main.css>; rel=preload; as=style"
Header add Link "</js/app.js>; rel=preload; as=script"
Header add Link "</fonts/roboto.woff2>; rel=preload; as=font; crossorigin"
</Location>
# Push'u aktifleştir
H2Push on
H2PushPriority application/javascript interleaved
H2PushPriority text/css before
H2PushPriority image/jpeg after 32
SSLEngine on
# ... devam eder
</VirtualHost>
Gerçek dünya senaryosu: 50 farklı statik kaynağa sahip bir web uygulamasında selective push kullanarak sadece above-the-fold için kritik olan 3-4 kaynağı push etmek, tüm kaynakları push etmekten çok daha iyi sonuç veriyor. Ölçüp karar ver.
Log Formatını HTTP/2 için Güncelle
HTTP/2 bağlantılarını takip etmek için log formatını güncellemek faydalı:
# /etc/apache2/apache2.conf veya virtual host yapılandırmasına ekle
# Protokol bilgisini logla
LogFormat "%h %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i" %{ratio}n%% %{SSL_PROTOCOL}x %{HTTP2}x" combined_http2
# Virtual host'ta kullan
CustomLog ${APACHE_LOG_DIR}/access.log combined_http2
Bu sayede log dosyanda hangi isteklerin HTTP/2 üzerinden geldiğini görebilirsin:
# HTTP/2 isteklerini filtrele
grep "h2" /var/log/apache2/access.log | wc -l
# HTTP/1.1 ile HTTP/2 oranını karşılaştır
awk '{print $NF}' /var/log/apache2/access.log | sort | uniq -c
Yaygın Sorunlar ve Çözümleri
Sorun 1: “HTTP/2 is not supported or disabled”
# Modülün gerçekten yüklendiğini kontrol et
apache2ctl -M | grep http2
# Eğer yoksa, paketi yeniden yükle
sudo apt-get install --reinstall apache2
sudo a2enmod http2
Sorun 2: prefork MPM ile HTTP/2 çalışmıyor
# Hata logu kontrol et
sudo tail -f /var/log/apache2/error.log
# MPM değiştir
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo systemctl restart apache2
Sorun 3: SSL sertifika sorunları nedeniyle HTTP/2 aktifleşmiyor
# SSL yapılandırmasını test et
openssl s_client -connect example.com:443
# Certificate chain'i kontrol et
# Let's Encrypt sertifika yenileme
sudo certbot renew --dry-run
Sorun 4: Bazı eski proxy veya CDN’ler HTTP/2 ile uyumsuz
Bu durumda virtual host seviyesinde fallback yapılandırması kullan:
# Eğer arkada HTTP/1.1 konuşan bir proxy varsa
ProxyHTMLURLMap http: https:
RequestHeader set X-Forwarded-Proto "https"
# Upstream bağlantı için HTTP/1.1 kullan, client'a HTTP/2 sun
Protocols h2 http/1.1
H2ProxyRequests off
Performans Ölçümü: Öncesi ve Sonrası
HTTP/2’ye geçiş sonrasında performansı ölçmek için birkaç araç öneriyorum:
# h2load ile yük testi (nghttp2 paketinde geliyor)
sudo apt install nghttp2-client
# Temel HTTP/2 performans testi
h2load -n 1000 -c 50 -m 30 https://example.com/
# Parametreler:
# -n: toplam istek sayısı
# -c: eş zamanlı bağlantı sayısı
# -m: bağlantı başına maksimum stream
Apache Benchmark ile karşılaştırma yapabilirsin ama ab HTTP/2 desteklemiyor, bu yüzden wrk veya h2load tercih et:
# wrk ile test
sudo apt install wrk
# HTTP/2 destekli test
wrk -t12 -c400 -d30s --latency https://example.com/
Gerçek ortamda gördüğüm tipik kazanımlar:
- TTFB (Time to First Byte): %15-30 iyileşme
- Sayfa tam yükleme süresi: %20-40 iyileşme (özellikle çok sayıda asset’i olan sayfalarda)
- Eş zamanlı bağlantı sayısı: Dramatik düşüş, çünkü tek bağlantı üzerinden çok işlem yapılıyor
- Sunucu kaynak tüketimi: Daha az açık bağlantı = daha az RAM ve CPU
Güvenlik Başlıkları ile Tamamla
HTTP/2 aktifleştirirken güvenlik başlıklarını da güncellemek iyi pratik:
<VirtualHost *:443>
ServerName example.com
Protocols h2 http/1.1
# Güvenlik başlıkları
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
# HTTP/2 için önerilen TLS yapılandırması
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder off
SSLCompression off
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# ... diğer yapılandırmalar
</VirtualHost>
Sonuç
Apache üzerinde HTTP/2 aktifleştirmek, düşük maliyetle yüksek performans kazanımı sağlayan nadir operasyonlardan biri. Temel akış şu şekilde: mod_http2 modülünü etkinleştir, event MPM’e geç (PHP kullanıyorsan PHP-FPM ile), virtual host yapılandırmana Protocols h2 http/1.1 ekle, SSL yapılandırmanı modernize et ve test et.
Production ortamında dikkat etmen gereken en kritik nokta MPM seçimi. Hala prefork üzerinde mod_php çalıştırıyorsan, HTTP/2’ye geçiş aynı zamanda PHP-FPM migrasyonunu da gerektiriyor. Bu biraz daha kapsamlı bir iş ama uzun vadede hem performans hem de güvenlik açısından doğru adım.
Server Push’u temkinli kullan. Her şeyi push etmek cazip geliyor ama tarayıcı cache mekanizmasını devre dışı bırakıyor ve gereksiz bant genişliği tüketiyor. Sadece kritik, above-the-fold kaynaklar için anlamlı.
Son olarak: HTTP/2’ye geçtikten sonra mutlaka ölçüm yap. h2load ve wrk ile yük testleri çalıştır, Google PageSpeed veya WebPageTest ile gerçek dünya performansını karşılaştır. Sayılar seni şaşırtacak, özellikle çok sayıda statik asset sunan uygulamalarda.