Apache’de HTTP/2 Aktifleştirme ve Performans Kazanımları

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.

Yorum yapın