Nginx ile FastCGI Önbellekleme: Dinamik PHP Sayfalarınızı Uçurun 
Selam sistemciler!
Bugün terminalin tozunu alıyor ve sunucularımızın en çok yorulan kısmına, dinamik PHP işlemlerine bir performans dopingi yapacağız. Hepimiz biliyoruz ki statik dosyaları hızlandırmak nispeten kolay. Peki ya her istekte veritabanına gidip gelen, işlem yapan, kısacası "canlı" olan PHP sayfaları? İşte tam burada FastCGI Önbellekleme (FastCGI Cache) devreye giriyor. Bu yöntemle, bir PHP sayfasının oluşturulmuş halini (HTML çıktısını) belirli bir süreliğine saklayarak, aynı sayfaya yapılan sonraki isteklerde PHP ve MySQL'e hiç bulaşmadan, doğrudan önbellekten servis edebiliyoruz. Sonuç? İnanılmaz düşük yanıt süreleri ve CPU/RAM üzerinde muazzam bir rahatlama.
FastCGI Önbellek Nedir ve Ne Zaman Kullanılır?
Temel mantığı basit: Bir kullanıcı site.com/makale-1 sayfasını ilk kez ziyaret ettiğinde, Nginx bu isteği PHP-FPM'ye iletir. PHP, kodu çalıştırır, veritabanından veriyi çeker, HTML üretir ve Nginx'e gönderir. Nginx de bu HTML çıktısını hem kullanıcıya gönderir, hem de (kurallara uyuyorsa) diske veya belleğe kaydeder. Aynı sayfaya ikinci bir kullanıcı geldiğinde, Nginx artık PHP'ye sormaz, doğrudan önbellekten hazır HTML'i sunar.
İdeal olduğu senaryolar:
Uygun olmadığı senaryolar:
Adım Adım Kurulum ve Yapılandırma (Ubuntu/Debian)
Öncelikle, Nginx'inizin fastcgi_cache modülü ile derlendiğinden emin olun. Çoğu dağıtım paketinde bu modül mevcuttur.
Çıktı olarak `fastcgi_cache` görmelisiniz. Şimdi ana yapılandırmaya geçelim.
1. Önbellek Bölgesini Tanımlama:
İlk iş, önbellek verilerini nerede ve nasıl saklayacağımızı Nginx'e söylemek. Genellikle `/etc/nginx/nginx.conf` dosyasının `http {` bloğu içine aşağıdaki satırları ekliyoruz.
Parametre Açıklamaları:
2. Site Konfigürasyonunu Güncelleme:
Şimdi, önbelleklemek istediğimiz sitenin Nginx server bloğunu (örneğin `/etc/nginx/sites-available/sitem`) düzenliyoruz. `location ~ \.php$` bloğunu bulup veya oluşturup aşağıdaki gibi değiştiriyoruz.
Test ve Debug Süreci
Ayarları kaydettikten sonra Nginx yapılandırmasını test edip yeniden başlatalım.
Şimdi tarayıcınızın geliştirici araçlarını (F12) açın ve "Network" sekmesinden sitenize bir istek atın. Yanıt başlıklarında (Response Headers) `X-Fastcgi-Cache: HIT` gördüyseniz, tebrikler! Önbellek çalışıyor ve sayfa önbellekten servis ediliyor. Diğer olası değerler:
Önbelleği Temizleme ve Yönetme
Bazen bir içeriği güncellediğinizde önbelleği manuel temizlemeniz gerekebilir. Önbellek dosyaları `fastcgi_cache_path` ile belirttiğiniz dizinde (örn. `/var/run/nginx-cache`) saklanır. Bu dizini tamamen silip Nginx'i yeniden başlatarak tüm önbelleği temizleyebilirsiniz.
Daha akıllı bir yöntem için, özel bir URL veya script yazarak sadece belirli bir sayfanın önbelleğini temizleyebilirsiniz (örneğin, `fastcgi_cache_key`'i bilerek).
Son Söz ve Güvenlik Notu
FastCGI önbellekleme, doğru yapılandırıldığında sunucu kaynaklarınızı ve sitenizin hızını adeta bir süper güce dönüştürür. Ancak en kritik nokta, neyin önbelleklenip neyin önbelleklenmeyeceğini doğru tanımlamaktır. Kullanıcıya özel içerik gösteren sayfaları önbelleklerseniz, Ahmet'in "Hesabım" sayfası Mehmet'e gözükebilir! Kurallarınızı (`$skip_cache`) çok dikkatli belirleyin ve mutlaka farklı kullanıcı hesaplarıyla test edin.
Peki ya siz? Bu yöntemi daha önce denediniz mi? Ya da yüksek trafikli bir sitenizde karşılaştığınız en ilginç performans sorunu neydi? Aşağıdaki yorumlarda deneyimlerinizi paylaşın, beraber çözüm bulalım!
Selam sistemciler!
FastCGI Önbellek Nedir ve Ne Zaman Kullanılır?
Temel mantığı basit: Bir kullanıcı site.com/makale-1 sayfasını ilk kez ziyaret ettiğinde, Nginx bu isteği PHP-FPM'ye iletir. PHP, kodu çalıştırır, veritabanından veriyi çeker, HTML üretir ve Nginx'e gönderir. Nginx de bu HTML çıktısını hem kullanıcıya gönderir, hem de (kurallara uyuyorsa) diske veya belleğe kaydeder. Aynı sayfaya ikinci bir kullanıcı geldiğinde, Nginx artık PHP'ye sormaz, doğrudan önbellekten hazır HTML'i sunar.
İdeal olduğu senaryolar:
- Haber siteleri, bloglar, ürün sayfaları (sık güncellenmeyen içerikler)
- Kullanıcıya özel olmayan, herkese aynı gözüken sayfalar (ana sayfa, iletişim)
- Yüksek trafikli sitelerde veritabanı yükünü azaltmak
Uygun olmadığı senaryolar:
- Kullanıcı girişi yapılmış sayfalar (header'da "Hoş geldin, Ahmet" yazan sayfalar)
- Alışveriş sepeti sayfaları
- Anlık veri gösteren sayfalar (borsa, canlı skor)
Adım Adım Kurulum ve Yapılandırma (Ubuntu/Debian)
Öncelikle, Nginx'inizin fastcgi_cache modülü ile derlendiğinden emin olun. Çoğu dağıtım paketinde bu modül mevcuttur.
Bash:
nginx -V 2>&1 | grep -o fastcgi_cache
Çıktı olarak `fastcgi_cache` görmelisiniz. Şimdi ana yapılandırmaya geçelim.
1. Önbellek Bölgesini Tanımlama:
İlk iş, önbellek verilerini nerede ve nasıl saklayacağımızı Nginx'e söylemek. Genellikle `/etc/nginx/nginx.conf` dosyasının `http {` bloğu içine aşağıdaki satırları ekliyoruz.
NGINX:
http {
# FastCGI Önbellek Bölgesi
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=FASTCGICACHE:100m inactive=60m use_temp_path=off;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout updating http_500 http_503;
fastcgi_cache_valid 200 301 302 10m; # 200, 301, 302 kodlu yanıtları 10 dakika önbellekle
fastcgi_cache_valid 404 1m; # 404 hatalarını 1 dakika önbellekle
fastcgi_ignore_headers Cache-Control Expires Set-Cookie; # ÖNEMLİ: Bu satır dikkatle kullanılmalı!
}
Parametre Açıklamaları:
- `fastcgi_cache_path`: Önbellek dosyalarının saklanacağı dizin (`/var/run/nginx-cache`). `levels` alt dizin yapısı, `keys_zone` bellekteki adı ve boyutu (100MB), `inactive` kullanılmayan öğelerin ne kadar sonra silineceği (60 dakika).
- `fastcgi_cache_key`: Önbellek anahtarını nasıl oluşturacağı. Aynı anahtara sahip istekler aynı önbellekten beslenir.
- `fastcgi_cache_valid`: Hangi HTTP durum kodlarının ne kadar süreyle önbellekleneceğini belirler.
- `fastcgi_ignore_headers`: DİKKAT! PHP'nin gönderdiği "Cache-Control: no-cache" gibi başlıkları görmezden gelir. Bu olmadan önbellek çalışmayabilir, ancak kontrolsüz kullanımı yanlış sayfaların önbelleklenmesine yol açar.
2. Site Konfigürasyonunu Güncelleme:
Şimdi, önbelleklemek istediğimiz sitenin Nginx server bloğunu (örneğin `/etc/nginx/sites-available/sitem`) düzenliyoruz. `location ~ \.php$` bloğunu bulup veya oluşturup aşağıdaki gibi değiştiriyoruz.
NGINX:
server {
listen 80;
server_name sitem.com;
root /var/www/sitem;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
# FASTCGI ÖNBELLEK AYARLARI
set $skip_cache 0;
# POST isteklerini önbellekleme
if ($request_method = POST) {
set $skip_cache 1;
}
# Query string içeren istekleri önbellekleme (genellikle dinamik)
if ($query_string != "") {
set $skip_cache 1;
}
# Admin, giriş, sepet gibi URL'leri önbellekleme (KENDİ YOLUNUZA GÖRE DÜZENLEYİN!)
if ($request_uri ~* "/wp-admin/|/wp-login.php|/uye-girisi|/sepetim") {
set $skip_cache 1;
}
# Çerez (Cookie) kontrolü: Eğer bir oturum çerezi varsa önbellekleme (WordPress için)
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
# Önbellek mekanizmasını aktif et
fastcgi_cache FASTCGICACHE;
fastcgi_cache_bypass $skip_cache; # Yukarıdaki kurallara göre önbelleği atla
fastcgi_no_cache $skip_cache; # Yukarıdaki kurallara göre önbelleğe yazma
fastcgi_cache_valid 200 301 302 10m;
# Önbellek durum başlığını ekle (Debug için faydalı)
add_header X-Fastcgi-Cache $upstream_cache_status;
}
}
Test ve Debug Süreci
Ayarları kaydettikten sonra Nginx yapılandırmasını test edip yeniden başlatalım.
Bash:
nginx -t
systemctl reload nginx
Şimdi tarayıcınızın geliştirici araçlarını (F12) açın ve "Network" sekmesinden sitenize bir istek atın. Yanıt başlıklarında (Response Headers) `X-Fastcgi-Cache: HIT` gördüyseniz, tebrikler! Önbellek çalışıyor ve sayfa önbellekten servis ediliyor. Diğer olası değerler:
- `MISS`: Önbellekte yok, PHP'den geldi, muhtemelen ilk kez önbelleğe yazıldı.
- `BYPASS`: `$skip_cache` kuralları nedeniyle önbellek atlandı.
- `EXPIRED`: Önbellek süresi dolmuş, yenileniyor.
- `STALE`: `fastcgi_cache_use_stale` sayesinde, arka uç hata verse bile eski önbellek sunuluyor.
Önbelleği Temizleme ve Yönetme
Bazen bir içeriği güncellediğinizde önbelleği manuel temizlemeniz gerekebilir. Önbellek dosyaları `fastcgi_cache_path` ile belirttiğiniz dizinde (örn. `/var/run/nginx-cache`) saklanır. Bu dizini tamamen silip Nginx'i yeniden başlatarak tüm önbelleği temizleyebilirsiniz.
Bash:
rm -rf /var/run/nginx-cache/*
systemctl reload nginx
Daha akıllı bir yöntem için, özel bir URL veya script yazarak sadece belirli bir sayfanın önbelleğini temizleyebilirsiniz (örneğin, `fastcgi_cache_key`'i bilerek).
Son Söz ve Güvenlik Notu
FastCGI önbellekleme, doğru yapılandırıldığında sunucu kaynaklarınızı ve sitenizin hızını adeta bir süper güce dönüştürür. Ancak en kritik nokta, neyin önbelleklenip neyin önbelleklenmeyeceğini doğru tanımlamaktır. Kullanıcıya özel içerik gösteren sayfaları önbelleklerseniz, Ahmet'in "Hesabım" sayfası Mehmet'e gözükebilir! Kurallarınızı (`$skip_cache`) çok dikkatli belirleyin ve mutlaka farklı kullanıcı hesaplarıyla test edin.
Peki ya siz? Bu yöntemi daha önce denediniz mi? Ya da yüksek trafikli bir sitenizde karşılaştığınız en ilginç performans sorunu neydi? Aşağıdaki yorumlarda deneyimlerinizi paylaşın, beraber çözüm bulalım!