Cloudflare ile HTTP/2 ve HTTP/3 Aktifleştirme Rehberi

Modern web performansının temel taşlarından biri olan HTTP protokol versiyonları, sitenizin hız ve güvenilirlik açısından nasıl davranacağını doğrudan etkiler. Cloudflare kullanıyorsanız bu konuda gerçekten şanslısınız çünkü hem HTTP/2 hem de HTTP/3 desteğini birkaç tıklamayla etkinleştirebilirsiniz. Ama “tıkla aktifleştir” kısmı aslında hikayenin sadece başlangıcı. Asıl mesele bu protokollerin ne işe yaradığını, arkada nasıl çalıştığını ve aktifleştirdikten sonra ne izlemeniz gerektiğini bilmek.

HTTP/2 ve HTTP/3 Neden Önemli?

HTTP/1.1, 1997 yılında standartlaştı ve onlarca yıl webın omurgası oldu. Ancak modern web uygulamaları için ciddi darboğazlar yaratıyor. En büyük sorun head-of-line blocking yani sıra bekleme problemi. Bir bağlantı üzerinden aynı anda sadece bir istek işlenebilir, diğerleri sıraya girer.

HTTP/2 bu sorunu multiplexing ile çözdü. Tek bir TCP bağlantısı üzerinden birden fazla istek ve yanıt eş zamanlı akabilir. Buna ek olarak header sıkıştırma (HPACK), sunucu push ve ikili protokol formatı gibi özellikler de getirdi.

HTTP/3 ise daha radikal bir adım attı. TCP’den tamamen vazgeçip QUIC protokolü üzerine inşa edildi. QUIC, UDP tabanlı çalışır ve özellikle paket kaybı olan ağlarda çok daha iyi performans gösterir. Mobil kullanıcılar ağ değiştirdiğinde (Wi-Fi’den 4G’ye geçiş gibi) bağlantıyı kesmeden devam edebilir, bu özelliğe connection migration deniyor.

Cloudflare, HTTP/3 için kendi QUIC implementasyonu olan quiche kütüphanesini geliştirmiştir ve bu alanda endüstride önemli bir oyuncu konumundadır.

Ön Koşullar

Başlamadan önce birkaç şeyin yerinde olması gerekiyor:

  • Alan adınızın Cloudflare’e eklenmiş ve DNS kayıtlarının Cloudflare üzerinden yönetiliyor olması
  • Sitenizin Proxied modda olması (turuncu bulut ikonu aktif)
  • Geçerli bir SSL/TLS sertifikasının mevcut olması (HTTP/2 ve HTTP/3 HTTPS gerektirir)
  • Cloudflare hesabınızın en azından Free plan üzerinde olması

SSL/TLS ayarlarınızı kontrol etmek için Cloudflare dashboard üzerinden SSL/TLS > Overview bölümüne gidin. Mode en az “Flexible” olmalı, idealde “Full (Strict)” kullanmanızı öneririm.

HTTP/2’yi Cloudflare Üzerinden Aktifleştirme

Dashboard Üzerinden

Cloudflare dashboard’a giriş yaptıktan sonra ilgili alan adını seçin. Sol menüden Speed > Optimization bölümüne gidin. Protocol Optimization başlığı altında HTTP/2 ve HTTP/3 ayarlarını göreceksiniz.

HTTP/2 toggle’ını On konumuna getirin. Bu kadar. Cloudflare edge node’ları artık HTTP/2 destekleyen istemcilerle HTTP/2 üzerinden iletişim kuracak.

API Üzerinden Aktifleştirme

Dashboard yerine API kullanmayı tercih edenler için veya birden fazla zone’u toplu olarak yapılandırmanız gerekiyorsa Cloudflare API’si çok işe yarıyor.

Önce Zone ID’nizi öğrenin:

curl -X GET "https://api.cloudflare.com/client/v4/zones?name=alanadin.com" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_ANAHTARINIZ" 
  -H "Content-Type: application/json" | python3 -m json.tool

HTTP/2’yi etkinleştirin:

curl -X PATCH "https://api.cloudflare.com/client/v4/zones/ZONE_ID/settings/http2" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_ANAHTARINIZ" 
  -H "Content-Type: application/json" 
  --data '{"value":"on"}'

Mevcut durumu kontrol etmek için:

curl -X GET "https://api.cloudflare.com/client/v4/zones/ZONE_ID/settings/http2" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_ANAHTARINIZ" 
  -H "Content-Type: application/json"

Yanıt olarak şöyle bir şey görmelisiniz:

{
  "result": {
    "id": "http2",
    "value": "on",
    "modified_on": "2024-01-15T10:30:00Z",
    "editable": true
  },
  "success": true
}

HTTP/2 Server Push Kullanımı

HTTP/2’nin güzel özelliklerinden biri sunucu tarafının tarayıcı istemeden önce kaynakları gönderebilmesi. Cloudflare bunu Link header üzerinden destekliyor. Nginx veya Apache sunucunuzdan bu header’ı gönderin, Cloudflare otomatik olarak push işlemini gerçekleştirir.

Nginx yapılandırmanıza ekleyin:

location / {
    add_header Link "</css/style.css>; rel=preload; as=style";
    add_header Link "</js/app.js>; rel=preload; as=script";
    try_files $uri $uri/ /index.html;
}

Ancak bir uyarı: HTTP/2 Server Push, 2022’de Chrome tarafından desteği kaldırılan bir özellik haline geldi çünkü cache’de zaten olan kaynakları gereksiz yere push etme problemi vardı. Yerine tag’ini HTML’e gömmek daha güvenilir bir yaklaşım.

HTTP/3 ve QUIC Aktifleştirme

Dashboard Üzerinden

Aynı Speed > Optimization bölümünde HTTP/3 (QUIC) seçeneğini bulup aktifleştirin. HTTP/2 açık olduğunda HTTP/3 de açılabilir hale gelir.

API Üzerinden HTTP/3 Aktifleştirme

curl -X PATCH "https://api.cloudflare.com/client/v4/zones/ZONE_ID/settings/http3" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_ANAHTARINIZ" 
  -H "Content-Type: application/json" 
  --data '{"value":"on"}'

0-RTT özelliğini de etkinleştirin (tekrar eden ziyaretçiler için bağlantı kurulum süresini sıfıra indirir):

curl -X PATCH "https://api.cloudflare.com/client/v4/zones/ZONE_ID/settings/0rtt" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_ANAHTARINIZ" 
  -H "Content-Type: application/json" 
  --data '{"value":"on"}'

Dikkat: 0-RTT replay attack açığı oluşturabilir. Sadece idempotent GET istekleri için güvenli kabul edilir. POST istekleri gibi state değiştiren operasyonlarda risk vardır. Eğer uygulamanız hassas form işlemleri yapıyorsa bu özelliği devre dışı bırakın veya backend’inizde replay koruması uygulayın.

Doğrulama ve Test

Tarayıcı DevTools ile Kontrol

Chrome DevTools’u açın (F12), Network sekmesine gidin. Siteyi yükleyin ve herhangi bir kaynağa sağ tıklayıp Protocol sütununu görünür yapın. h2 görüyorsanız HTTP/2, h3 görüyorsanız HTTP/3 üzerinden bağlantı kurulmuş demektir.

curl ile Komut Satırından Test

# HTTP/2 kontrolü
curl -I --http2 https://alanadin.com -v 2>&1 | grep -E "HTTP/[0-9]|< HTTP"

# HTTP/3 kontrolü (curl 7.66+ gerekli)
curl -I --http3 https://alanadin.com -v 2>&1 | grep -E "HTTP/[0-9]|< HTTP"

# Kullanılan protokolü ve bağlantı bilgilerini görmek için
curl -w "%{http_version}n" -o /dev/null -s https://alanadin.com

Alt Header’ı Kontrol Etme

Cloudflare, hangi protokolün kullanıldığını response header’larında belirtir:

curl -sI https://alanadin.com | grep -i "cf-"

alt-svc header’ı HTTP/3 için tarayıcıya sinyal gönderir:

curl -sI https://alanadin.com | grep -i "alt-svc"
# Çıktı: alt-svc: h3=":443"; ma=86400

Bu header tarayıcıya “bu sunucu 443 portunda HTTP/3 destekliyor, 86400 saniye boyunca bunu kullan” der.

Terraform ile Altyapı Olarak Kod

Birden fazla Cloudflare zone yönetiyorsanız veya altyapınızı kod olarak tutmak istiyorsanız Terraform kullanmak çok mantıklı.

terraform {
  required_providers {
    cloudflare = {
      source  = "cloudflare/cloudflare"
      version = "~> 4.0"
    }
  }
}

provider "cloudflare" {
  api_token = var.cloudflare_api_token
}

resource "cloudflare_zone_settings_override" "site_settings" {
  zone_id = var.zone_id

  settings {
    http2      = "on"
    http3      = "on"
    zero_rtt   = "on"
    
    # TLS 1.3 de HTTP/3 için önerilir
    tls_1_3 = "zrt"
    
    # HSTS aktifleştirmek de iyi pratik
    security_header {
      enabled            = true
      include_subdomains = true
      max_age            = 31536000
      preload            = true
    }
  }
}

Değişkenleri tanımlayın:

variable "cloudflare_api_token" {
  description = "Cloudflare API token"
  type        = string
  sensitive   = true
}

variable "zone_id" {
  description = "Cloudflare Zone ID"
  type        = string
}

Uygulayın:

terraform init
terraform plan
terraform apply

Bu yaklaşım özellikle 10+ alan adı yöneten ajanslar ve kurumsal ortamlar için büyük kolaylık sağlar. Ayrıca tüm değişiklikler versiyon kontrolünde tutulur.

Gerçek Dünya Senaryoları

Senaryo 1: E-Ticaret Sitesi Performans Optimizasyonu

Bir müşterimin e-ticaret sitesi vardı, ürün sayfaları ortalama 4.2 saniyede yükleniyordu. Site Cloudflare üzerindeydi ama HTTP/2 kapalıydı. HTTP/1.1’de tarayıcı domain başına 6 paralel bağlantı açıyor, site ise ortalama 45 kaynak yüklüyordu.

HTTP/2’yi aktifleştirdikten sonra multiplexing sayesinde tüm bu kaynaklar tek bağlantı üzerinden akarken yükleme süresi 2.8 saniyeye düştü. HTTP/3’ü de aktifleştirip mobil test ettiğimizde özellikle 4G/LTE kullanan kullanıcılarda ek %15-20 iyileşme gözlemledik.

Aynı müşteri için alt-svc header’ının düzgün dönüp dönmediğini şöyle monitöre ettik:

#!/bin/bash
# http3_check.sh - HTTP/3 destek kontrolü

DOMAIN="$1"
RESULT=$(curl -sI "https://${DOMAIN}" | grep -i "alt-svc")

if echo "$RESULT" | grep -q "h3"; then
    echo "[OK] ${DOMAIN} HTTP/3 destekliyor: ${RESULT}"
else
    echo "[WARN] ${DOMAIN} HTTP/3 alt-svc header bulunamadi"
    # Alert gönder
    curl -s -X POST "https://hooks.slack.com/services/TOKEN" 
      -H 'Content-type: application/json' 
      --data "{"text":"HTTP/3 kontrolü başarısız: ${DOMAIN}"}"
fi

Senaryo 2: Medya Sitesi ve Yoğun Trafik

Bir haber sitesiyle çalışırken ana sorun yoğun trafik dönemlerinde (breaking news) server’ların bağlantı sayısından bunalmasıydı. HTTP/1.1’de her kullanıcı birden fazla TCP bağlantısı açıyor, bu da sunucu tarafında ciddi yük yaratıyordu.

HTTP/2 multiplexing’e geçince aynı içerik için açılan TCP bağlantısı sayısı dramatik biçimde düştü. Origin sunucuya ulaşan bağlantı sayısı da azaldı çünkü Cloudflare edge ile origin arasındaki bağlantılar da HTTP/2 üzerinden daha verimli kullanılıyordu.

Nginx origin sunucu yapılandırmasında da HTTP/2 aktifleştirmeniz gerekir (Cloudflare – origin arası için):

server {
    listen 443 ssl http2;
    server_name alanadin.com;
    
    ssl_certificate /etc/letsencrypt/live/alanadin.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/alanadin.com/privkey.pem;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
    
    # HTTP/2 push için
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Senaryo 3: Çok Sayıda Alt Alan Adı Olan Kurumsal Yapı

Büyük bir kurumsal müşteride 30’dan fazla subdomain vardı ve hepsinde tek tek ayar yapmak yerine Cloudflare API ile toplu yapılandırma scripti yazdık:

#!/bin/bash
# bulk_http_settings.sh

API_EMAIL="[email protected]"
API_KEY="your_global_api_key"
ZONES=("zone_id_1" "zone_id_2" "zone_id_3")

for ZONE_ID in "${ZONES[@]}"; do
    echo "Zone güncelleniyor: ${ZONE_ID}"
    
    # HTTP/2 aktifleştir
    HTTP2_RESULT=$(curl -s -X PATCH 
      "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/http2" 
      -H "X-Auth-Email: ${API_EMAIL}" 
      -H "X-Auth-Key: ${API_KEY}" 
      -H "Content-Type: application/json" 
      --data '{"value":"on"}')
    
    # HTTP/3 aktifleştir
    HTTP3_RESULT=$(curl -s -X PATCH 
      "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/http3" 
      -H "X-Auth-Email: ${API_EMAIL}" 
      -H "X-Auth-Key: ${API_KEY}" 
      -H "Content-Type: application/json" 
      --data '{"value":"on"}')
    
    # Sonuçları kontrol et
    if echo "$HTTP2_RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if d['success'] else 1)"; then
        echo "[OK] Zone ${ZONE_ID}: HTTP/2 aktifleştirildi"
    else
        echo "[ERROR] Zone ${ZONE_ID}: HTTP/2 aktifleştirme başarısız"
        echo "$HTTP2_RESULT"
    fi
    
    sleep 1  # Rate limiting için kısa bekle
done

Yaygın Sorunlar ve Çözümleri

HTTP/3 Çalışmıyor Gibi Görünüyor

En yaygın sorun: UDP trafiğinin güvenlik duvarı tarafından engellenmesi. QUIC, UDP 443 portunu kullanır. Kurumsal ağlarda UDP trafiği çoğunlukla kısıtlanır. Bu durumda tarayıcı otomatik olarak HTTP/2’ye fallback yapar, yani site çalışmaya devam eder ama HTTP/3’ün faydalarından yararlanamaz.

Bunu test etmek için:

# UDP 443 portuna erişim kontrolü
nc -u -z -v alanadin.com 443

# Daha detaylı QUIC bağlantı testi
curl --http3-only -v https://alanadin.com 2>&1 | head -30

Origin Sunucu HTTP/2’yi Desteklemiyor

Cloudflare ile origin arasında HTTP/1.1 kullanılıyor olsa bile istemci ile Cloudflare arasında HTTP/2 veya HTTP/3 kullanılır. Ancak mümkünse origin’de de HTTP/2 açık olsun, tam uçtan uca performans için önemli.

Mixed Content Hataları

HTTP/2 ve HTTP/3 sadece HTTPS üzerinden çalışır. Sitenizde HTTP ile yüklenen kaynaklar varsa bunlar düzeltilmeli. Cloudflare’in “Always Use HTTPS” ve “Automatic HTTPS Rewrites” özelliklerini açın.

Performans İzleme

Cloudflare Analytics’te HTTP versiyonu dağılımını göremezsiniz doğrudan, ancak Web Analytics veya Enterprise logları ile bunu takip edebilirsiniz. Alternatif olarak kendi access loglarınızı analiz edebilirsiniz.

Nginx’te $server_protocol değişkeni HTTP versiyonunu loglar:

log_format detailed '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    'proto=$server_protocol';

access_log /var/log/nginx/access.log detailed;

Log analizi için:

# HTTP versiyonu dağılımı
awk '{print $NF}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# Son 1000 istekte HTTP/2 oranı
tail -1000 /var/log/nginx/access.log | grep -c "proto=HTTP/2"

Sonuç

HTTP/2 ve HTTP/3 aktifleştirme Cloudflare tarafında gerçekten birkaç dakikalık bir işlem. Ama asıl değer bu protokollerin nasıl çalıştığını anlamaktan, 0-RTT gibi özelliklerin güvenlik trade-off’larını bilmekten ve altyapınızı Terraform gibi araçlarla yönetilebilir hale getirmekten geliyor.

Öncelik sıranız şöyle olsun: önce HTTP/2’yi açın, sitenizin düzgün çalıştığından emin olun, ardından HTTP/3’ü etkinleştirin. UDP trafiği kısıtlı ortamlarda HTTP/3 otomatik fallback yapacağı için güvenle açabilirsiniz. 0-RTT özelliğini ise uygulamanızın POST işlemlerini nasıl yönettiğini inceledikten sonra kararlaştırın.

Birden fazla zone yönetiyorsanız API scriptlerini veya Terraform’u kullanmaya başlayın. Manuel dashboard işlemleri ölçeklenmez ve hata yapmaya açık. Altyapınızı kod olarak tutmak, hem ekip çalışması hem de değişiklik takibi açısından size çok zaman kazandırır.

Son olarak şunu söyleyeyim: Bu protokol güncellemeleri ücretsiz Cloudflare planında bile mevcut. Kullanmamak için gerçekten hiçbir neden yok.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir