format_list_bulletedBu İçerikte Bahsedilen Konular
- arrow_rightNginx ile Statik Dosya Sunumunda Önbellek Başlıkları: Kapsamlı Rehber
- arrow_rightÖnbellek Başlıklarının Önemi
- arrow_rightÖnbellek Katmanları
- arrow_rightTemel HTTP Önbellek Başlıkları
- arrow_right1. Cache-Control
- arrow_right2. ETag (Entity Tag)
- arrow_right3. Last-Modified
- arrow_right4. Expires
- arrow_rightNginx Önbellek Yapılandırması: Karşılaştırma Tablosu
- arrow_rightPratik Nginx Yapılandırmaları
- arrow_rightStatik Dosyalar İçin Tam Yapılandırma
- arrow_rightProxied Backend İçin Önbellek
- arrow_rightÖnbellek Başlıkları İçin En İyi Uygulamalar
- arrow_right1. immutable Özniteliği Kullanımı
- arrow_right2. Vary Başlığı
- arrow_right3. Önbellek Yıkma (Cache Busting)
- arrow_right4. Güvenlik Başlıkları
- arrow_rightSık Yapılan Hatalar ve Çözümleri
- arrow_rightHata 1: Önbelleksiz Sunulan Statik Dosyalar
- arrow_rightHata 2: Dinamik İçeriğin Aşırı Önbelleklenmesi
- arrow_rightHata 3: ETag ve Last-Modified Eksikliği
- arrow_rightPerformans İzleme ve Test
- arrow_rightSonuç
Nginx ile Statik Dosya Sunumunda Önbellek Başlıkları: Kapsamlı Rehber
Web performansını optimize etmenin en etkili yollarından biri, statik dosyaların doğru şekilde önbelleğe alınmasıdır. Nginx, yüksek performanslı web sunucusu olarak statik içerik sunumunda önbellek başlıklarını yapılandırmanızı sağlar. Doğru önbellek yapılandırması, sunucu yanıt sürelerini %60-80 oranında iyileştirebilir ve bant genişliği tüketimini önemli ölçüde azaltabilir.
Önbellek Başlıklarının Önemi
HTTP önbellek başlıkları, tarayıcıların ve ara bellek sunucularının içerikleri ne kadar süreyle saklayacağını belirler. Yanlış yapılandırılmış önbellek ayarları, gereksiz ağ trafiğine, yavaş sayfa yüklemelerine ve kötü kullanıcı deneyimine yol açar. Google'ın Core Web Vitals raporlarına göre, LCP (Largest Contentful Paint) skorları doğrudan statik kaynakların önbelleklenmesiyle ilişkilidir.
Önbellek Katmanları
Web mimarisinde üç temel önbellek katmanı bulunur:
- Tarayıcı Önbelleği: Kullanıcının cihazında yerel olarak saklanan kaynaklar
- CDN Önbelleği: İçerik dağıtım ağlarındaEdge sunucularda tutulan kopyalar
- Reverse Proxy Önbelleği: Nginx gibi ara sunuculardaki önbellek
Temel HTTP Önbellek Başlıkları
1. Cache-Control
Cache-Control başlığı, modern HTTP önbelleklemenin temelini oluşturur. Bu başlık, önbellek davranışını detaylı şekilde kontrol eder.
location /static/ {
expires 7d;
add_header Cache-Control "public, max-age=604800, immutable";
}
2. ETag (Entity Tag)
ETag, içeriğin belirli bir sürümünü tanımlayan benzersiz bir tanımlayıcıdır. İçerik değiştiğinde ETag değeri de değişir, bu sayede tarayıcılar güncel içerik olup olmadığını kontrol edebilir.
location /static/ {
etag on;
}
3. Last-Modified
Bu başlık, kaynağın son değiştirilme tarihini belirtir. İstemci, "If-Modified-Since" isteğiyle kaynağın değişip değişmediğini sorgulayabilir.
location /static/ {
last_modified on;
}
4. Expires
Expires başlığı, kaynağın önbellekten kullanılabileceği kesin tarih ve saati belirtir. Cache-Control başlığıyla birlikte kullanılması önerilir.
expires modified +1w;
Nginx Önbellek Yapılandırması: Karşılaştırma Tablosu
| Senaryo | Cache-Control Değeri | Önerilen Süre | Kullanım Amacı |
|---|---|---|---|
| CSS ve JavaScript | public, max-age=31536000, immutable | 1 yıl | Sürüm değişikliklerinde URL değişir |
| Görseller (logolar, ikonlar) | public, max-age=2592000 | 30 gün | Nadiren değişen görseller |
| Favicon ve manifest | public, max-age=604800 | 1 hafta | Site ikonları için |
| API yanıtları | no-cache, must-revalidate | Yok | Her seferinde güncel veri gerekli |
| HTML sayfaları | no-cache | Yok | Dinamik içerik |
Pratik Nginx Yapılandırmaları
Statik Dosyalar İçin Tam Yapılandırma
server {
listen 80;
server_name example.com;
root /var/www/html;
# Tüm statik dosyalar için önbellek
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000";
access_log off;
}
# CSS ve JS için uzun süreli önbellek
location ~* \.(css|js)$ {
expires 1y;
add_header Cache-Control "public, max-age=31536000, immutable";
}
# Önbellek break için versionlama
location /assets/ {
expires 1y;
add_header Cache-Control "public, max-age=31536000, immutable";
# Sürüm kontrolü
if ($request_uri ~* \.(jpg|jpeg|png|gif|ico|css|js|svg)$) {
add_header Vary "Accept-Encoding";
}
}
}
Proxied Backend İçin Önbellek
Bulut sunucu üzerinde Nginx'i reverse proxy olarak kullanıyorsanız, upstream yanıtlarını önbellekleyebilirsiniz:
proxy_cache_path /var/cache/nginx levels=1:2
keys_zone=static_cache:10m
max_size=100m
inactive=60m
use_temp_path=off;
server {
location / {
proxy_cache static_cache;
proxy_cache_valid 200 60m;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://backend;
}
}
Önbellek Başlıkları İçin En İyi Uygulamalar
1. immutable Özniteliği Kullanımı
CSS ve JavaScript dosyaları için "immutable" değeri kullanıldığında, içerik değişmediği sürece tarayıcı hiçbir şekilde sunucuya sorgu göndermez. Bu özellik, modern tarayıcılarda %100 desteklenmektedir.
2. Vary Başlığı
İçerik encoding (gzip/deflate) veya dil gibi faktörlere göre değişiyorsa, Vary başlığı kullanılmalıdır:
add_header Vary "Accept-Encoding, Accept-Language";
3. Önbellek Yıkma (Cache Busting)
Dosyalar güncellendiğinde tarayıcıların yeni sürümü yüklemesi için dosya adına sürüm numarası ekleyin:
# Önceki: style.css
# Sonraki: style.v1.2.3.css
4. Güvenlik Başlıkları
Önbellek başlıklarıyla birlikte güvenlik başlıklarını da ekleyin:
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
Sık Yapılan Hatalar ve Çözümleri
Hata 1: Önbelleksiz Sunulan Statik Dosyalar
Yanlış: Tüm kaynaklar için "no-cache" kullanmak
Doğru: Statik dosyalar için uzun süreli önbellek süreleri belirlemek
Hata 2: Dinamik İçeriğin Aşırı Önbelleklenmesi
Yanlış: Oturum verileri içeren sayfaları uzun süre önbelleğe almak
Doğru: Kişiselleştirilmiş içerik için "no-cache" veya "private" kullanmak
Hata 3: ETag ve Last-Modified Eksikliği
Bu başlıklar olmadan, tarayıcılar içeriğin değişip değişmediğini anlayamaz ve her seferinde dosyayı yeniden indirir.
Performans İzleme ve Test
Önbellek yapılandırmanızı test etmek için Chrome DevTools veya curl kullanabilirsiniz:
curl -I https://example.com/style.css
HTTP/1.1 200 OK
Server: nginx
Cache-Control: public, max-age=31536000, immutable
ETag: "5f47a1b3-2c4d"
Expires: Thu, 01 Jan 2026 00:00:00 GMT
Sonuç
Nginx ile doğru önbellek başlıkları yapılandırmak, web sitesi performansını önemli ölçüde artırır. Statik dosyalar için uzun süreli önbellek (1 yıl), dinamik içerik için kısa süreli veya önbelleksiz yapılandırma kullanmalısınız. ETag ve Last-Modified başlıklarını etkin tutarak, içerik değişikliklerinde tarayıcıların hızlı tepki vermesini sağlayabilirsiniz.
Unutmayın: Önbellek, hem kullanıcı deneyimini hem de sunucu performansını doğrudan etkiler. Doğru yapılandırılmış bir önbellek sistemi, sunucu yükünü azaltırken kullanıcılara daha hızlı bir deneyim sunar.