Caddy ile HTTP/2 ve HTTP/3 QUIC Yapılandırması

Modern web trafiğinin büyük çoğunluğu artık şifreli bağlantılar üzerinden akıyor ve kullanıcılar her geçen gün daha hızlı, daha güvenilir bağlantılar bekliyor. Caddy, bu ihtiyaçlara karşılık veren, HTTP/2’yi varsayılan olarak destekleyen ve HTTP/3 QUIC protokolünü de bünyesinde barındıran modern bir web sunucusu. Eğer hâlâ Apache veya Nginx ile HTTP/1.1 üzerinde koşuyorsan ve performans iyileştirmesi arıyorsan, bu yazı tam sana göre.

HTTP/2 ve HTTP/3 QUIC Nedir, Neden Önemli?

HTTP/2, HTTP/1.1’in getirdiği sınırlamaları aşmak için 2015 yılında standartlaştırıldı. En temel farklar şunlar:

  • Multiplexing: Tek bir TCP bağlantısı üzerinden birden fazla istek paralel olarak gönderilebiliyor
  • Header Compression (HPACK): Tekrar eden başlıklar sıkıştırılıyor, bant genişliği tasarrufu sağlanıyor
  • Server Push: Sunucu, istemci istemeden önce kaynakları önceden gönderebiliyor
  • Binary Protocol: Metin tabanlı değil, binary formatında çalışıyor, ayrıştırma daha hızlı

HTTP/3 ise işi bir adım daha ileri taşıyor. TCP yerine UDP tabanlı QUIC protokolünü kullanıyor. Bu değişiklik küçük görünse de etkileri devasa:

  • Head-of-Line Blocking Yok: HTTP/2’de bir paket kaybolduğunda tüm akışlar beklemek zorunda kalıyor. QUIC’te her akış bağımsız, kayıp sadece ilgili akışı etkiliyor
  • 0-RTT Bağlantı Kurma: Daha önce bağlanılmış sunuculara sıfır round-trip süresinde bağlantı kurulabiliyor
  • Bağlantı Göçü: Mobil cihazlarda WiFi’den 4G’ye geçerken bağlantı kopmadan devam edebiliyor
  • Yerleşik TLS 1.3: QUIC, şifrelemeyi protokolün içine entegre ediyor

Caddy bu üç protokolü de destekliyor ve en güzel yanı, çoğu yapılandırma otomatik olarak devreye giriyor.

Caddy Kurulumu

Başlamadan önce sisteme Caddy kuralım. Ubuntu/Debian üzerinde:

# Gerekli bağımlılıkları kur
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl

# Caddy GPG anahtarını ekle
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

# Repo ekle
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list

# Güncelle ve kur
sudo apt update
sudo apt install caddy

# Servis durumunu kontrol et
sudo systemctl status caddy

RHEL/CentOS/Fedora için:

# Caddy repo dosyasını oluştur
sudo dnf install 'dnf-command(copr)'
sudo dnf copr enable @caddy/caddy
sudo dnf install caddy

# Servisi başlat ve etkinleştir
sudo systemctl enable --now caddy
sudo systemctl status caddy

Versiyon kontrolü ile kurulumun başarılı olduğunu doğrulayalım:

caddy version
# Örnek çıktı: v2.7.6 h1:w0NymbG2m9PcvKWsrXO6EEkY9Ru4FJK8uQbYcev1p3A=

# HTTP/3 desteğini kontrol et
caddy build-info | grep quic

Temel Caddyfile Yapısı

Caddy’nin yapılandırma dosyası olan Caddyfile, son derece okunabilir bir sözdizimi sunuyor. /etc/caddy/Caddyfile dosyasını düzenleyelim:

# Yedek al
sudo cp /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak

# Düzenle
sudo nano /etc/caddy/Caddyfile

Basit bir HTTP/2 yapılandırması:

example.com {
    root * /var/www/html
    file_server
    
    # HTTP/2 Caddy'de varsayılan olarak aktif
    # TLS otomatik yönetiliyor (Let's Encrypt)
    
    encode gzip zstd
    
    log {
        output file /var/log/caddy/access.log
        format json
    }
}

Caddy burada otomatik olarak şunları yapıyor:

  • Otomatik TLS: Let’s Encrypt’ten sertifika alıyor
  • HTTP -> HTTPS yönlendirmesi: 80 portunu 443’e yönlendiriyor
  • HTTP/2 aktif: TLS ile birlikte HTTP/2 otomatik geliyor
  • HSTS başlıkları: Güvenli bağlantıyı zorunlu kılıyor

HTTP/3 QUIC Yapılandırması

HTTP/3’ü etkinleştirmek için birkaç adım gerekiyor. Öncelikle güvenlik duvarı ayarlarını yapmalısın, çünkü QUIC UDP 443 portunu kullanıyor:

# UFW kullanıyorsan
sudo ufw allow 443/udp
sudo ufw allow 443/tcp
sudo ufw reload

# firewalld kullanıyorsan
sudo firewall-cmd --permanent --add-port=443/udp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload

# iptables ile
sudo iptables -A INPUT -p udp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4

Şimdi Caddyfile’a HTTP/3 desteğini ekleyelim:

{
    # Global ayarlar bloğu
    servers {
        protocol {
            experimental_http3
        }
    }
}

example.com {
    root * /var/www/html
    file_server
    
    encode gzip zstd
    
    # HTTP/3 için Alt-Svc başlığı
    header {
        Alt-Svc `h3=":443"; ma=86400`
        X-Content-Type-Options nosniff
        X-Frame-Options DENY
        Referrer-Policy strict-origin-when-cross-origin
    }
    
    log {
        output file /var/log/caddy/access.log
        format json
    }
}

experimental_http3 direktifi Caddy 2.6 öncesi sürümlerde gerekli. Caddy 2.6 ve sonrasında HTTP/3 varsayılan olarak etkin, sadece UDP portunu açman yeterli.

Caddy’yi yeniden başlat ve yapılandırmayı doğrula:

# Yapılandırmayı test et
sudo caddy validate --config /etc/caddy/Caddyfile

# Servisi yeniden başlat
sudo systemctl reload caddy

# HTTP/3 aktif mi kontrol et
curl -sI --http3 https://example.com | head -20

# Alternatif: online test
# https://http3check.net adresinden test edebilirsin

Gerçek Dünya Senaryosu: Çoklu Domain Yapılandırması

Diyelim ki bir sunucu üzerinde birden fazla domain çalıştırıyorsun. Biri statik site, biri bir uygulama için reverse proxy, diğeri API sunucusu:

{
    email [email protected]
    
    servers {
        protocol {
            experimental_http3
        }
    }
}

# Statik web sitesi
www.sirketiniz.com {
    root * /var/www/sirket
    file_server
    
    encode gzip zstd
    
    header {
        Alt-Svc `h3=":443"; ma=86400`
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
        X-Content-Type-Options nosniff
    }
    
    # Cache kontrolü
    @static {
        file
        path *.css *.js *.png *.jpg *.gif *.ico *.woff2
    }
    header @static Cache-Control "public, max-age=31536000, immutable"
    
    log {
        output file /var/log/caddy/sirket-access.log
    }
}

# Node.js uygulaması için reverse proxy
app.sirketiniz.com {
    reverse_proxy localhost:3000 {
        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto {scheme}
        
        # Sağlık kontrolü
        health_uri /health
        health_interval 30s
        health_timeout 5s
    }
    
    header {
        Alt-Svc `h3=":443"; ma=86400`
    }
}

# API sunucusu
api.sirketiniz.com {
    reverse_proxy localhost:8080 {
        lb_policy round_robin
    }
    
    # API için rate limiting
    rate_limit {
        zone dynamic {
            key {remote_host}
            events 100
            window 1m
        }
    }
    
    header {
        Alt-Svc `h3=":443"; ma=86400`
        Access-Control-Allow-Origin "https://www.sirketiniz.com"
    }
}

Load Balancing ile HTTP/2 ve HTTP/3

Birden fazla backend sunucuya trafik dağıtıyorsan, Caddy’nin yerleşik load balancer’ını kullanabilirsin:

{
    servers {
        protocol {
            experimental_http3
        }
    }
}

yuksek-trafik.example.com {
    reverse_proxy {
        # Backend sunucuları
        to backend1.internal:8080
        to backend2.internal:8080
        to backend3.internal:8080
        
        # Yük dengeleme politikası
        lb_policy least_conn
        
        # Bağlantı yönetimi
        transport http {
            # HTTP/2 ile backend bağlantısı
            versions 2
            keepalive 30s
            keepalive_idle_conns 10
        }
        
        # Pasif sağlık kontrolü
        fail_duration 30s
        max_fails 3
        unhealthy_status 500 502 503
        
        # Aktif sağlık kontrolü
        health_uri /ping
        health_interval 10s
        health_timeout 3s
        health_status 200
    }
    
    header {
        Alt-Svc `h3=":443"; ma=86400`
    }
    
    log {
        output file /var/log/caddy/lb-access.log
        format json
    }
}

TLS Yapılandırmasını Özelleştirme

Caddy’nin otomatik TLS’i harika, fakat üretim ortamında daha ince ayar yapmak gerekebilir:

{
    email [email protected]
    
    # Let's Encrypt staging (test için)
    # acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
    
    servers {
        protocol {
            experimental_http3
        }
        # TLS 1.3 için optimize et
        strict_sni_host
    }
}

guvenli.example.com {
    tls {
        # Minimum TLS versiyonu
        protocols tls1.2 tls1.3
        
        # Güçlü cipher suite'ler
        ciphers TLS_AES_128_GCM_SHA256 TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256
        
        # OCSP Stapling otomatik, elle de belirtebilirsin
        # curves x25519 p256 p384
    }
    
    root * /var/www/guvenli
    file_server
    
    header {
        Alt-Svc `h3=":443"; ma=86400`
        Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
        X-Content-Type-Options "nosniff"
        X-Frame-Options "SAMEORIGIN"
        Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'"
        Permissions-Policy "geolocation=(), microphone=(), camera=()"
    }
}

Performans İzleme ve Debugging

HTTP/3 çalışıyor mu, ne kadar trafik aldığını nasıl anlarsın? Caddy’nin yerleşik metric desteğini kullanalım:

# Caddy admin API'sini aktif et
# /etc/caddy/Caddyfile başına ekle:
{
    admin 0.0.0.0:2019
    
    servers {
        protocol {
            experimental_http3
        }
        metrics
    }
}
# Aktif bağlantıları kontrol et
curl -s http://localhost:2019/metrics | grep caddy_http

# Yapılandırmayı API üzerinden gör
curl -s http://localhost:2019/config/ | python3 -m json.tool

# Log'ları takip et
sudo journalctl -u caddy -f

# Erişim loglarını izle ve HTTP versiyonuna göre filtrele
sudo tail -f /var/log/caddy/access.log | grep '"proto":"HTTP/3"'

# HTTP/3 bağlantı sayısını say
sudo grep -c '"proto":"HTTP/3"' /var/log/caddy/access.log

Curl ile farklı protokolleri test etmek için:

# HTTP/1.1 ile bağlan
curl -v --http1.1 https://example.com

# HTTP/2 ile bağlan
curl -v --http2 https://example.com

# HTTP/3 ile bağlan (curl 7.66+ gerekli, QUIC desteği ile derlenmiş olmalı)
curl -v --http3 https://example.com

# Kullanılan protokolü gör
curl -w "%{http_version}n" -o /dev/null -s https://example.com

# Bağlantı sürelerini detaylı görmek için
curl -w "DNS: %{time_namelookup}s | Connect: %{time_connect}s | TLS: %{time_appconnect}s | Total: %{time_total}sn" 
     -o /dev/null -s https://example.com

Yaygın Sorunlar ve Çözümleri

UDP 443 portuna ulaşılamıyor: En sık karşılaşılan sorun bu. Cloud sağlayıcılarında (AWS, GCP, Azure) güvenlik gruplarında UDP 443’ü ayrıca açman gerekiyor. Bazı kurumsal ağlarda UDP trafiği firewall tarafından bloklanıyor olabilir; bu durumda HTTP/3, HTTP/2’ye otomatik düşüyor.

“experimental_http3 not supported” hatası: Eski bir Caddy sürümü kullanıyorsundur. Caddy 2.6+ sürüme geç, bu direktife artık ihtiyaç yok.

Let’s Encrypt sertifika alınamıyor: DNS kayıtlarının doğru yönlendirildiğinden ve 80/443 portlarının açık olduğundan emin ol:

# Sertifika durumunu kontrol et
sudo caddy certificates

# Manuel sertifika al
sudo caddy run --config /etc/caddy/Caddyfile

# Caddy log'larında ACME hatalarını ara
sudo journalctl -u caddy | grep -i "acme|certificate|tls"

# DNS çözümlemesini test et
dig +short example.com
nslookup example.com

Yüksek bellek kullanımı: Çok fazla domain için TLS sertifikası tutuyorsan veya keepalive bağlantıları birikmişse şunu dene:

# Caddy'nin ne kadar bellek kullandığını gör
sudo systemctl status caddy | grep Memory

# Process detayları
ps aux | grep caddy

# Limit ayarlamak için systemd unit dosyasını düzenle
sudo systemctl edit caddy
# [Service]
# MemoryMax=512M
# LimitNOFILE=65536

Systemd Servis Optimizasyonu

Üretim ortamı için Caddy’nin systemd ayarlarını optimize edelim:

sudo systemctl edit caddy --force
[Service]
# Yeniden başlatma politikası
Restart=on-failure
RestartSec=5s

# Dosya tanımlayıcı limiti
LimitNOFILE=1048576

# Ağ performansı
PrivateNetwork=no

# Güvenlik sertleştirme
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=/var/log/caddy /var/lib/caddy /etc/caddy

# UDP buffer boyutunu artır (QUIC için önemli)
# /etc/sysctl.conf'a da ekle

QUIC performansı için kernel parametrelerini ayarla:

# /etc/sysctl.conf veya /etc/sysctl.d/99-quic.conf dosyasına ekle
sudo tee /etc/sysctl.d/99-quic.conf << 'EOF'
# UDP buffer boyutlarını artır (QUIC/HTTP3 için)
net.core.rmem_max = 7500000
net.core.wmem_max = 7500000
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576

# Bağlantı kuyruğu
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
EOF

# Değişiklikleri uygula
sudo sysctl -p /etc/sysctl.d/99-quic.conf

HTTP/3 Uyumluluğunu Test Etme

Yapılandırmanın çalıştığını birkaç farklı yöntemle doğrulayabilirsin:

# HTTP/3 destekli curl ile test
curl -I --http3 https://example.com 2>&1 | grep -E "HTTP|Alt-Svc|server"

# Quic.cloud veya benzeri online araçlar
# https://http3check.net
# https://cloudflare-quic.com/

# Chrome/Firefox geliştirici araçlarında Network sekmesinde
# Protocol sütununu kontrol et, h3 görünmeli

# Wireshark ile QUIC paketlerini yakala
sudo tcpdump -i eth0 udp port 443 -w /tmp/quic-capture.pcap

# nmap ile UDP port kontrolü
nmap -sU -p 443 example.com

Sonuç

Caddy ile HTTP/2 ve HTTP/3 QUIC yapılandırması, geleneksel web sunucularına kıyasla son derece az zahmetle gerçekleştirilebiliyor. Özet olarak kritik noktalar şunlar:

  • HTTP/2 Caddy’de TLS ile birlikte otomatik olarak aktif geliyor, ekstra yapılandırma gerektirmiyor
  • HTTP/3 QUIC için UDP 443 portunu açmak ve Caddy 2.6 öncesinde experimental_http3 direktifini eklemek yeterli
  • Alt-Svc başlığı tarayıcılara HTTP/3 desteğini duyuruyor, bu başlığı eklemeyi unutma
  • Kernel UDP buffer ayarları QUIC performansını doğrudan etkiliyor, özellikle yüksek trafikli sitelerde bu ayarları mutlaka yap
  • Cloud ortamlarında güvenlik grupları ve firewall kurallarında UDP 443’ü ayrıca açmayı unutma

Gerçek dünyada HTTP/3’ün en çok fayda sağladığı senaryolar; yüksek paket kayıp oranına sahip mobil ağlar, coğrafi olarak dağık kullanıcı kitlesi ve çok sayıda küçük kaynak yükleyen web uygulamaları. Statik içerik ağırlıklı sitelerde de sayfa yükleme sürelerinde belirgin iyileşme görebilirsin. Caddy bu iyileştirmelerin önünü senin için açık tutuyor; geriye sadece doğru yapılandırmayı yapmak kalıyor.

Yorum yapın