Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Nginx Microcache (Mikro Önbellek) Yapılandırması ile Dinamik İçeriğin Kısa Süreli Önbelleklenmesi

nexter

Üye
Katılım
14 Mart 2026
Mesajlar
36
Merhaba arkadaşlar, bugün sizlere özellikle yoğun dinamik içerikli sitelerde (forumlar, e-ticaret, WordPress) sunucu yükünü ciddi anlamda düşüren, benim de sıkça başvurduğum bir performans hilesinden bahsedeceğim: Nginx Microcache. Bu yöntem, aslında önbelleğe alınmaz denilen dinamik sayfaları bile, saniyeler mertebesinde (1-10 sn) önbellekleyerek aynı anda gelen yüzlerce isteğe tek bir PHP/Backend işlemiyle cevap vermenizi sağlar. Sonuç? CPU ve RAM kullanımında gözle görülür bir rahatlama.

🔍 Microcache Nedir ve Ne İşe Yarar?

Basitçe anlatmak gerekirse, normalde her kullanıcı için ayrı ayrı çalıştırılan PHP, database sorguları gibi işlemleri, çok kısa bir süreliğine tüm kullanıcılar için ortak hale getirir. Diyelim ki anasayfanız 2 saniyeliğine önbelleklendi. Bu 2 saniye içinde siteye gelen ilk ziyaretçi sayfayı normal şekilde oluşturur ve cevap alır. Ama 2 saniye dolmadan gelen diğer tüm ziyaretçilere, Nginx önbellekten aynı hazır HTML'yi anında sunar. Bu, trafik patlamalarında sunucunuzun nefes almasını sağlar.

⚙️ Temel Nginx Microcache Yapılandırması

Öncelikle, Nginx'inizin fastcgi_cache veya proxy_cache modüllerinin yüklü olduğundan emin olun. Yapılandırmayı genelde ana nginx.conf veya /etc/nginx/conf.d/microcache.conf gibi bir dosyada yaparız. İlk olarak önbellek bölgesini (zone) tanımlayalım.

NGINX:
# http bloğu içine ekleyin.
http {
    # Microcache için önbellek bölgesi tanımlıyoruz.
    # 100MB boyut, 10 dakika (600s) süreyle veri tutacak.
    # keys_zone=microcache:100m -> 'microcache' isminde 100MB RAM kullanan bir anahtar alanı.
    # max_size=1g -> Önbellek dosyaları diskte maksimum 1GB yer kaplayabilir.
    # inactive=600s -> 10 dakika boyunca erişilmeyen önbellek dosyaları silinir.
    fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=microcache:100m max_size=1g inactive=600s use_temp_path=off;
}

Şimdi, bu önbellek bölgesini PHP (PHP-FPM) için çalışan server/location bloğunuzda kullanacağız. Genellikle location ~ \.php$ bloğunun içine aşağıdaki direktifleri ekleriz.

NGINX:
server {
    listen 80;
    server_name sizin_domain.com;

    location ~ \.php$ {
        # ... (fastcgi_pass, fastcgi_index, fastcgi_param gibi standart ayarlarınız zaten var)

        # MICROCACHE AYARLARI
        fastcgi_cache microcache; # Yukarıda tanımladığımız bölgeyi kullan.
        fastcgi_cache_key "$scheme$request_method$host$request_uri"; # Önbellek anahtarını belirle.
        fastcgi_cache_valid 200 301 302 5s; # Başarılı ve yönlendirme cevaplarını 5 saniye önbellekle.
        fastcgi_cache_use_stale updating error timeout invalid_header http_500 http_503; # Backend hata verirse eski önbelleği göster.
        fastcgi_cache_background_update on; # Önbellek yenilemesini arka planda yap, kullanıcıyı bekletme.
        fastcgi_cache_lock on; # Aynı anda sadece bir istek önbelleği yenilesin.

        # Önbellek durumunu bir header ile görmek isteyebilirsiniz (Opsiyonel).
        add_header X-Cache-Status $upstream_cache_status;
    }
}

⚠️ Dikkat Edilmesi Gerekenler ve İstisnalar

Her sayfayı önbelleklemek istemeyiz! Giriş yapmış kullanıcılar (logged-in users), alışveriş sepeti, yönetici paneli gibi kişiselleştirilmiş alanları önbelleklememeliyiz. Bunun için basit bir koşul koyarız. En yaygın yöntem, çerez (cookie) kontrolüdür.

NGINX:
server {
    # ... diğer ayarlar

    # Önbelleği atlamak için bir koşul seti oluşturalım.
    set $skip_cache 0;

    # Kullanıcı oturum çerezi (örneğin WordPress için 'wordpress_logged_in') varsa önbellekleme.
    if ($http_cookie ~ "wordpress_logged_in|PHPSESSID|ci_session") {
        set $skip_cache 1;
    }

    # POST isteklerini önbellekleme.
    if ($request_method = POST) {
        set $skip_cache 1;
    }

    # Yönetici veya belirli URL'leri (örn: /admin/, /sepetim) önbellekten hariç tut.
    if ($request_uri ~ "/wp-admin/|/admin/|/sepetim|/uye/|/giris-yap") {
        set $skip_cache 1;
    }

    location ~ \.php$ {
        # ... diğer fastcgi ayarları

        # Skip_cache koşulunu burada kullanıyoruz.
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;

        # ... diğer fastcgi_cache direktifleri
    }
}

🔧 Önbellek Klasörü İzinleri ve Temizleme

Önbellek klasörünün Nginx çalışan kullanıcısı (genelde www-data veya nginx) tarafından yazılabilir olması gerekir. Ayrıca sunucu yeniden başlatıldığında bu klasörü temizlemek iyi olur.

Bash:
# Önbellek klasörünü oluştur ve izinleri ver.
sudo mkdir -p /var/cache/nginx
sudo chown -R www-data:www-data /var/cache/nginx
sudo chmod -R 755 /var/cache/nginx

Yapılandırmayı bitirdikten sonra mutlaka Nginx'i test edip yeniden başlatın.

Bash:
sudo nginx -t
sudo systemctl reload nginx  # veya restart

📈 Sonuç ve Performans Gözlemi

Ayarlar aktif olduktan sonra, siteyi ziyaret edip tarayıcınızın geliştirici araçlarındaki "Network" sekmesinden X-Cache-Status header'ını kontrol edin. "HIT" görürseniz önbellekten sunuluyor, "MISS" görürseniz backend'den taze oluşturuluyor demektir. Yoğun bir trafik anında top veya htop ile CPU kullanımına bakın, eskiye nazaran ciddi bir düşüş göreceksiniz.

Bu yöntem, özellikle Cloudflare gibi bir CDN ile birlikte kullanıldığında mükemmel sonuç verir. CDN daha uzun süreli önbellekler, Nginx ise saniyelik patlamaları yönetir.

Umarım bu rehber faydalı olmuştur. Benzer şekilde, statik asset'ler için de browser cache ve gzip/brotli sıkıştırmayı mutlaka aktif etmelisiniz. Siz bu microcache yapılandırmasını kendi sunucularınızda nasıl yapıyorsunuz? Farklı taktikleriniz veya sorularınız varsa aşağıya yazmaktan çekinmeyin. Herkese sorunsuz sunucular!
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri