biotech SEO & Performans

Nginx ile Statik Dosyaları Önbellekleme: Brotli, HTTP/3 ve CDN Rehberi

AK
Ali Kasımoğlu
22 Oca 2021 schedule 4 dk okuma
Nginx ile {p}Statik Dosyaları Önbellekleme{/p}: Brotli, HTTP/3 ve CDN Rehberi
analytics

Insight Density

groups Hedef Kitle: Deneyimli
65 Score

Teknik karmaşıklık ve içerik yoğunluğuna göre hesaplandı.

Son güncelleme: Nisan 2026 · AnomixLabs Teknik Ekibi

Statik dosya önbellekleme, sunucu maliyetini düşüren, sayfa hızını artıran ve kullanıcı deneyimini iyileştiren en düşük maliyetli optimizasyondur — doğru yapılandırılırsa.

Neden Statik Dosyaları Önbelleğe Almalısınız?

Tipik bir web sayfasında network trafiğinin %60-80'i statik dosyalardan (CSS, JS, görsel, font) oluşur. Bu dosyaların önbelleğe alınması:

  • Tekrar ziyaretlerde sayfa yükleme süresi %70-90 azalır
  • Sunucu bant genişliği kullanımı düşer
  • Lighthouse Performance skoru artar
  • Core Web Vitals (özellikle LCP) iyileşir

Cache-Control Header'ları

Temel Nginx statik dosya önbellekleme konfigürasyonu:

# /etc/nginx/sites-available/anomix.conf

server {
    listen 443 ssl http2;
    server_name anomixlabs.com;

    # Statik dosyalar — uzun cache
    location /static/ {
        alias /var/www/anomix/staticfiles/;
        expires 1y;
        add_header Cache-Control 'public, max-age=31536000, immutable';
        add_header Vary Accept-Encoding;
        access_log off;
        gzip_static on;
    }

    # Media dosyaları — kısa cache
    location /media/ {
        alias /var/www/anomix/media/;
        expires 30d;
        add_header Cache-Control 'public, max-age=2592000';
        access_log off;
    }
}

immutable Direktifi: Güçlü Optimizasyon

Cache-Control: immutable direktifi tarayıcıya 'bu dosya hiçbir zaman değişmeyecek, yenileme sırasında bile sorma' der. Bu, soft reload'da (F5) gereksiz kondisyonel istekleri (304 Not Modified) ortadan kaldırır.

Koşul: Immutable yalnızca content hash içeren dosya isimleriyle kullanılmalı. Django ile:

# settings.py
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
# Bu ayar collectstatic sırasında dosyalara hash ekler:
# main.css → main.3a7f9b2c.css
# Böylece içerik değişince URL değişir, cache sorunsuz geçersiz olur

Brotli vs Gzip: Hangisi Daha İyi?

Brotli (Google, 2015), gzip'ten daha iyi sıkıştırma oranı sunar — ancak CPU maliyeti daha yüksek:

  • Metin dosyaları (HTML/CSS/JS): Brotli gzip'ten %15-25 daha iyi sıkıştırır
  • Statik dosyalar için: Önceden sıkıştırılmış .br dosyası — CPU maliyeti yok
  • Dinamik içerik için: gzip daha pratik (daha hızlı encode)
  • Tarayıcı desteği: 2026 itibarıyla Brotli %97+ tarayıcı desteği
# Nginx Brotli modülü (nginx-module-brotli)
brotli on;
brotli_comp_level 6;           # 1-11 arası, 6 iyi denge
brotli_static on;              # önceden sıkıştırılmış .br dosyaları
brotli_types text/plain text/css application/javascript
             application/json image/svg+xml;

# Gzip fallback
gzip on;
gzip_static on;
gzip_vary on;
gzip_types text/plain text/css application/javascript application/json image/svg+xml;

HTTP/3 (QUIC) ile Nginx

HTTP/3, UDP tabanlı QUIC protokolü kullanarak HTTP/2'nin bazı kısıtlamalarını aşıyor — özellikle paket kaybı olan ağlarda belirgin performans artışı:

# Nginx 1.25+ ile HTTP/3 desteği
server {
    listen 443 ssl;
    listen 443 quic reuseport;  # HTTP/3 için QUIC
    http2 on;

    ssl_certificate /etc/letsencrypt/live/site.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/site.com/privkey.pem;

    # Tarayıcıya HTTP/3 desteğini bildir
    add_header Alt-Svc 'h3=":443"; ma=86400';
}

Not: HTTP/3 için Nginx mainline (1.25+) veya Nginx Plus gereklidir. Ubuntu 22.04+ paket deposunda mevcut. Cloudflare CDN arkasında HTTP/3 otomatik aktif olur.

WEBP ve AVIF için Nginx map Direktifi

Modern görsel formatlarını tarayıcı desteğine göre servis etmek için:

# Tarayıcı Accept header'ına göre modern format seç
map $http_accept $img_suffix {
    default         '';
    '~*avif'        '.avif';
    '~*webp'        '.webp';
}

server {
    location ~* \.(jpe?g|png)$ {
        add_header Vary Accept;
        try_files $uri$img_suffix $uri =404;
    }
}

Bu konfigürasyonla AVIF destekleyen tarayıcılar .avif, WebP destekleyenler .webp, diğerleri orijinal JPEG/PNG alır. Django collectstatic pipeline'ına AVIF/WebP üretimi eklemek için django-imagekit veya Pillow kullanılabilir.

Django collectstatic ve CI/CD Entegrasyonu

Production deployment sürecinde collectstatic otomatize edilmeli:

# .github/workflows/deploy.yml
- name: Collect static files
  run: |
    python manage.py collectstatic --noinput
    # ManifestStaticFilesStorage hash'leri bu adımda oluşturur

- name: Deploy to server
  run: |
    rsync -avz staticfiles/ user@server:/var/www/app/staticfiles/
    # Nginx yeniden başlatma gerekmez — dosyalar değişti, URL'ler de

WhiteNoise alternatifi: Küçük ve orta ölçekli projelerde django-whitenoise, Nginx olmadan Python sürecinden statik dosya servisi yapar. Compression ve caching otomatik. Nginx konfig karmaşıklığını elimine eder.

# settings.py — WhiteNoise
MIDDLEWARE = [
    'whitenoise.middleware.WhiteNoiseMiddleware',  # SecurityMiddleware'den hemen sonra
    ...
]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
# Bu ayar hem hash'li isimler hem Brotli/gzip sıkıştırma yapar

CDN ile Nginx Cache Entegrasyonu

Cloudflare, AWS CloudFront veya BunnyCDN gibi CDN'ler Nginx'in önüne oturur:

  • Origin Pull (Lazy Caching): CDN ilk istekte origin'den çeker, sonra CDN'den servis eder. En yaygın mod.
  • Push (Proactive Caching): Deploy sırasında dosyalar CDN'e push edilir. CI/CD ile tam kontrol.
  • Cache invalidation: Yeni deploy sonrası CDN cache'ini temizle — Cloudflare'de Zone Purge, CloudFront'ta Create Invalidation.
# Cloudflare cache purge (deploy script'e ekle)
curl -X POST 'https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/purge_cache' \
  -H 'Authorization: Bearer {API_TOKEN}' \
  -H 'Content-Type: application/json' \
  --data '{"purge_everything": true}'

Lighthouse Cache Audit

Lighthouse 'Serve static assets with an efficient cache policy' uyarısı, 1 yıldan kısa cache süresi olan statik dosyaları listeler. Düzeltme: /static/ altındaki tüm dosyalar için max-age=31536000 (1 yıl) + immutable.

Cache busting için ManifestStaticFilesStorage kullanıyorsanız bu Lighthouse uyarısını tamamen geçebilirsiniz.

Özet

Nginx statik cache için temel recipe: ManifestStaticFilesStorage ile hash'li dosya isimleri + Cache-Control max-age=31536000 + immutable. Brotli statik sıkıştırma ile %15-25 ek boyut tasarrufu. HTTP/3 modern Nginx'te yapılandırılabilir. CDN eklenince global dağıtım ve origin yük azalması bonus.

Sıkça Sorulan Sorular

CDN ile Nginx cache çakışırsa ne olur? expand_more
Çakışma genellikle stale (eski) içerik olarak görünür — deployment sonrası güncellenen dosya CDN'de eski haliyle kalır. Önlem: ManifestStaticFilesStorage ile içerik hash'li URL'ler — CDN her yeni URL'yi 'yeni dosya' olarak görür, eski cache bozulur. Ek önlem: deploy script'e CDN cache purge ekleyin. İki katmanlı önbellekleme (Nginx + CDN) güçlüdür ama invalidation stratejisi şart.
Media dosyalarını da cache etmeli miyim? expand_more
Evet ama daha kısa süre. Kullanıcı yüklediği görseller değişebilir (profil fotoğrafı güncellenmesi). Öneri: /media/ için max-age=2592000 (30 gün) + immutable yerine max-age only. Eğer dosya URL'si değişmiyorsa (aynı dosya üzerine yazılıyorsa) kısa cache şart. Django'da her upload'da benzersiz dosya adı için UUID veya timestamp hash ekleyin.
collectstatic CI/CD'ye nasıl entegre edilir? expand_more
Deploy pipeline'ın 'build' adımına ekleyin, 'deploy' adımından önce. Sıra önemli: 1) pip install requirements 2) python manage.py collectstatic --noinput 3) ManifestStaticFilesStorage hash'leri staticfiles/staticfiles.json'a yazar 4) Bu dosya ve static klasörü sunucuya rsync/scp ile kopyalanır. GitHub Actions, GitLab CI, Ansible playbook ile otomatize edilebilir. --noinput flag'i interactive prompt'ları devre dışı bırakır.
Cache invalidation stratejisi nedir? expand_more
Üç yaklaşım: 1) Content hash URL (en iyi — Django ManifestStaticFilesStorage): dosya değişince URL değişir, eski cache otomatik geçersiz. 2) Versiyonlu URL (?v=2.1.0): manuel güncelleme gerekir, kaçırılabilir. 3) Expire-based: belirli süreden sonra otomatik expire. Birinci yaklaşım en güvenilir — hash değişmeden CDN cache'i asla bozulmaz, hash değişince yeni URL zorunlu olarak CDN'i bypass eder.
WhiteNoise yeterli mi yoksa Nginx statik servis şart mı? expand_more
Küçük-orta ölçek için WhiteNoise yeterli ve basit. CompressedManifestStaticFilesStorage ile Brotli sıkıştırma ve hash URL'leri otomatik. Nginx statik servis avantajlı durumlar: çok yüksek trafik (Python procesi bypass, daha hızlı), Nginx advanced direktifleri (map, location block), CDN origin için Nginx log analizi. Railway, Render gibi PaaS'ta WhiteNoise daha pratik; bare-metal VPS'te Nginx statik servis tercih edilir.
Nginx'te gzip_static ve brotli_static ne işe yarıyor? expand_more
gzip_static ve brotli_static, dosya talep gelince sıkıştırma yapmak yerine daha önce oluşturulmuş .gz ve .br dosyalarını servis eder. Bu CPU tasarrufu demektir — sıkıştırma işlemi collectstatic sırasında bir kez yapılır, her istek için tekrar yapılmaz. WhiteNoise'da CompressedManifestStaticFilesStorage aynı şeyi Python tarafında yapar. Dinamik içerik (HTML response) için on-the-fly sıkıştırma zorunlu; statik için pre-compress her zaman tercih edilmeli.
HTTP/3 aktifleştirmek ne kadar performans artışı sağlıyor? expand_more
Yüksek paket kayıplı ağlarda (mobil, zayıf WiFi) HTTP/3 belirgin fark yaratır — HTTP/2'nin head-of-line blocking sorunu QUIC ile çözülür. İyi ağ koşullarında fark minimaldir. Cloudflare'nin 2023 verilerine göre HTTP/3 etkin URL'lerde sayfa yükleme %12 daha hızlı. Türkiye'deki mobil internet kalitesi göz önüne alındığında HTTP/3 etkinleştirmek makul — kurulum maliyeti düşük, kazanım özellikle mobil kullanıcılar için.
Etiketler: #Nginx #Cache #Statik Dosyalar #Brotli #HTTP/3 #CDN #Django #WhiteNoise #collectstatic #Performans
share

Bu Makaleyi Paylaş

Bilgiyi ağınızla paylaşarak bize destek olun.

AK

Ali Kasımoğlu

Full-stack Geliştirici & AnomixLabs Kurucusu

Python ve Django ekosisteminde uzmanlaşmış bir yazılım geliştirici. Modern web mimarileri, yapay zeka entegrasyonları ve minimalist kullanıcı deneyimleri üzerine odaklanıyor. AnomixLabs çatısı altında, karmaşık problemleri yalın ve etkili dijital çözümlere dönüştürmeyi hedefliyor.

psychology
psychology

Makale Hakkında Soru Sorun

AnomixAI · Makale içeriğine dayalı yanıtlar

5 soru hakkı
Yalnızca makale içeriği hakkında 0/500
forward_to_inbox

Geleceği Çözümleyin.

Enterprise yapay zeka, yazılım mimarisi ve dijital dönüşüm üzerine aylık brifingi alan 5.000+ mühendis ve kurucuya katılın. Spam yok.