Teknoloji

WordPress Medyanı S3’e Taşıyalım mı? CDN, İmzalı URL ve Önbellek Geçersizleştirme Adım Adım

İçindekiler

Bir Sabah Medya Klasörünün Kapısını Çaldığım Gün

Hiç başına geldi mi? Sabah kahveni almış, keşke her şey bugün hızlı aksa diye düşünürken WordPress’in uploads klasörüne bakarsın; gigabaytlar, yüzlerce küçük görsel, birkaç devasa video… Sunucunun nefesi kesik kesik. O gün, bir müşterinin sitesinde tam olarak bunu yaşadım. Sayfalar ağır açılıyor, CDN yok, medyalar PHP’nin omzuna yük gibi binmiş. Ben de bir nefes alıp “Bunu bir daha yaşamayalım” diye S3 uyumlu depolamaya taşıma fikrini masaya yatırdım.

Burada anlatacaklarım tam da o sürecin sıcak izleri: WordPress medyanı S3 uyumlu bir depoya taşırken nelere dikkat edilir, CDN nasıl bağlanır, özel içerikleri imzalı URL ile nasıl güvenli taşırız ve bir dosyayı güncellediğinde önbellek geçersizleştirme nasıl “şak” diye çalışır. Kulağa uzun bir yol gibi geliyor olabilir ama adımlar doğru olduğunda her şey şaşırtıcı derecede akıcı. Hadi birlikte yürüyelim.

Neden S3 Uyumlu Depolama? Ne Kazanırız, Neyi Fark Ederiz?

Bir arkadaş ortamında anlatır gibi söyleyeyim: Medyayı uygulama sunucusundan uzaklaştırdığında, sitenin sırtındaki çantayı hafifletiyorsun. Trafik arttığında paniklemiyorsun, depolama esnekliği elinin altında oluyor. Dosyaları bir yerde, uygulamayı başka bir yerde tutmanın verdiği rahatlık da cabası. Üstelik görüntüleri, PDF’leri, videoları istersen bir CDN ile dünyanın dört yanına yakın lokasyonlardan dağıtıyorsun.

Bir diğer güzellik: Sürümleme ve uzun ömürlü önbellek ayarlarıyla ziyaretçiye aynı dosyayı tekrar tekrar yüklatmıyorsun. Bu, hem performansı hem maliyeti etkiliyor. Dezavantaj yok mu? Var tabii. Yapılandırma doğru olmazsa CORS yüzünden tarayıcı trip atar, izinler yanlışsa 403 hatalarıyla boğuşursun, imzalı URL akışını iyi kurmazsan özel içerik elden kaçar. Ama düzgün adımlarsan hepsi kontrol altında.

Hazırlık: Kova, Anahtarlar, İzinler ve CORS

Bucket’ı Kurarken Bir Not Defteri Aç

İster Amazon S3, ister MinIO, Backblaze B2 ya da Wasabi gibi S3 uyumlu bir servis olsun, ilk iş bir bucket açıp not defterine küçük bir liste yap: bucket adı, bölge, erişim anahtarı, gizli anahtar, endpoint ve isteğe bağlı path style desteği. Burada temiz bir isimlendirme işini baştan kolaylaştırır. Mesela cdn.seninmarkan.com gibi bir CNAME düşüneceksen, bucket adını ve CDN adresini kafa karıştırmayacak şekilde kurgula.

İzinler ve Sürümleme

“Hepsini herkese açayım gitsin” refleksine kapılmak kolay ama dur. Genel dosyalar için CDN üzerinden erişim sağlamak en kıymetlisi. Kovayı tamamen herkese açık yapmak yerine, mümkünse dosyaları özel tutup CDN’e “orijin erişimi” yetkisi vermek daha güvenli. Bunun yanında versioning özelliğini açmak, aynı dosyayı güncellediğinde eski sürümü saklamana yardım eder. Hem yanlışlıkla silinen dosyalar için de küçük bir sigorta gibidir.

CORS Ayarını Unutma

WordPress, admin panelinden görsel kırpmaya çalıştığında, ya da bir görseli farklı bir domainden kullanırken tarayıcı CORS kontrolü yapar. Basit bir CORS kuralı hayat kurtarır. Örneğin Amazon S3’te temel bir CORS yapılandırması ile “GET, HEAD” isteklerine izin vermek çoğu senaryoda yeter. Resmi dokümana göz atmak istersen, S3 CORS yapılandırması için güzel bir adım adım anlatım var.

WordPress Tarafı: Eklenti Seçimi, Yükleme Kuralları ve URL’ler

Hangi Eklenti? Asıl Önemli Olan Ayar Disiplini

Bu işi yapan birkaç olgun eklenti var. “WP Offload Media” gibi seçenekler pratik bir yönetim paneli ve kütüphaneyi taşıma araçları sunuyor. Lite sürümünü WordPress deposunda amazon s3 ve cloudfront adıyla bulmak mümkün. Alternatif açık kaynak çözümlerle de ilerlenebilir. Seçim ne olursa olsun, eklentinin şu ayarları düzgün yapmasına dikkat et: bucket bilgisi, endpoint, erişim anahtarları, dosya yolu şablonu (örneğin uploads/2025/11/ gibi), URL değiştirme ve orijinali yerelde tut seçeneği.

Orijinali Sunucuda Tutmak mı, Tutmamak mı?

Ben genelde orijinali sunucuda tutmayı kapatıyorum. Çünkü asıl hedef, medyanın ağırlığını uygulama sunucusundan almak. Ama ilk geçişte “biraz güvende olayım” hissiyle bir süre açık tutulabilir. Yine de sonra temizlik şart. Eklenti, yeni yüklenen dosyaları kovaya atarken, var olan kütüphaneyi de sırayla taşıma özelliği sunuyorsa onu kullan. Böylece medyanın büyük kısmı otomatik taşınır, URL’ler de yeni adrese dönüştürülür.

URL’lerinizi Güzelce Yenileyin

CDN kullanacaksan, eklentide özel bir CDN domain’i tanımla. Bu, cdn.seninmarkan.com gibi bir alt alan adı olur. Dosya yollarını sabit ve tahmin edilebilir tut, böylelikle cache stratejileri daha net çalışır. Tarihe göre klasörleme alışkanlığı iş görür; istersen içerik türüne göre ön ekler de koyabilirsin. Örneğin media/images, media/videos gibi mantıklı ayrımlar, bir süre sonra düzenlemede nefes aldırır.

CDN Bağlamak: DNS, HTTPS ve Kenar Önbelleği

CDN’i Ortağa Dönüştürmek

CDN’i devreye aldığında, esas sihir dosyaların coğrafi olarak yakın noktalardan servis edilmesi. Benim pratik yaklaşımım şöyle: Önce CDN’de bir distribution oluştur, orijin olarak S3 uyumlu endpoint’i göster. Ardından DNS’te cdn.seninmarkan.com için CNAME kaydını bu dağıtıma yönlendir. HTTPS sertifikasını CDN üzerinde tanımla; çoğu sağlayıcı ücretsiz sertifika sunuyor. HTTP/2 ve HTTP/3 desteğini açmak akıcılığı ciddi etkiler; istersen bunu adım adım HTTP/2 ve HTTP/3 rehberimizdeki örneklerle birlikte düşün.

Cache-Control ve Uzun Ömürlü Önbellek

Statik medya için en sevdiğim yaklaşım “uzun TTL + sürümleme”. Yani dosyaları bir kez yayımladığında, tarayıcı ve CDN onun çok uzun süre değişmeyeceğini bilsin. Bunun için Cache-Control: public, max-age=31536000, immutable gibi bir başlık kullanmak mantıklı. “Peki ya dosyayı güncellersem?” diye sorarsan, işte burada sürümleme ve dosya adı değişikliği devreye giriyor. Az sonra geçersizleştirme bölümünde buna döneceğiz.

Güvenlik ve Sıkıştırma

CDN ile HTTPS zaten şart. Kenarda Brotli ve gzip gibi sıkıştırmaları uygun tipler için aktif tutmak, gönderilen baytları azaltır. Sunucu tarafında TLS ayarlarını sıkılaştırmak istersen, TLS 1.3 ve Brotli üzerine yazdığımız rehber elinin altında dursun. Statik medyada farkı net hissedersin, özellikle de büyük CSS/JS dosyaları ve SVG’lerde.

İmzalı URL: Özel İçeriği Kibarca Koruma

Hangi Senaryoda İmzalı URL?

Üyelik alanı, kurs videoları, ücretli e-kitaplar… Bazen her şey açık olmasın istersin. İmzalı URL, dosyaya erişimi belirli bir süreyle sınırlar. Linki kopyalayan da olsa, süresi dolunca işe yaramaz. Burada iki ana yol var: dosyayı doğrudan S3’ten imzalı linkle vermek ya da CDN tarafında imzalı URL/çerez mekanizmasını kullanmak. İkinci yol genellikle daha hızlı, çünkü kenar noktalardaki önbellekten servis edilir.

CDN İmzalı URL’lere Küçük Bir Pencere

CloudFront gibi bir dağıtımda signed URL veya signed cookies tercih edebilirsin. Bu akışta, belirlediğin anahtarla CDN’e “şu dosyaya şu süre kadar izin ver” dersin. Detaylı okumak istersen CloudFront imzalı URL mantığını anlatan rehber gayet net. WordPress tarafında üyelik kontrolünün ardından bu URL’leri üretip kullanıcıya sunarsın; sayfa kapalıyken dosya da kapalı kalır.

Toparlayıcı İpuçları

İmzalı URL üretirken kısa ve amaca uygun bir TTL seç. Çok kısa yaparsan kullanıcı deneyimi kırılabilir, çok uzun yaparsan güvenlik anlamını yitirir. Anahtarları WordPress kod tabanında düz metin gibi tutmamak, çevresel değişkenlerle yönetmek iyi bir refleks. Eklenti kullanıyorsan, imza üretimini kendi içinde yapanları tercih etmek işleri basitleştirir.

Önbellek Geçersizleştirme: “Dosyayı Güncelledim, Neden Hâlâ Eski?”

Sürümleme, Dosya Adı ve Hash

Bir görseli değiştirirsin, ama kullanıcı aynı URL ile eski sürümü görür. Bu, aslında güzel bir haber: Önbelleğin çalıştığını gösterir. Bununla başa çıkmanın en sağlıklı yolu dosya adını sürümlemek. Mesela banner.jpg yerine banner.2025-11.jpg ya da içerik hash’i kullanmak. Dosya adı değiştiğinde, CDN ve tarayıcı yeni kaynağı sıfırdan alır. Bu, kitle içinde “immutable” başlıkları gönül rahatlığıyla kullanmanın kapısını açar.

CDN Invalidation’ın Yeri

Bazen dosya adını değiştiremezsin, ya da bir SVG’nin hep aynı kalmasını istemişsindir. Bu durumda CDN invalidation devreye girer. Belirli bir yol desenini silersin; CDN bir sonraki istekte orijinden taze sürümü alır. Kurumsal sitelerde sürümleme artı invalidation kombinasyonu işin en dertsiz hali. WordPress’te görseli güncellediğinde eklentinin otomatik olarak ilgili yolu geçersiz kılmasını sağlamak, insan hatasını ciddi biçimde azaltır.

WordPress Tam Sayfa Önbelleğiyle Uyumu

Medya tarafını halletmek güzel ama tam sayfa önbelleği kullanıyorsan, resim URL’leri değiştiğinde sayfanın kendisini de yenilemek gerekir. Bu uyumu akılda tutmak şart. Tam sayfa önbelleğiyle ilgili pratik akışları topluca görmek istersen, WordPress’te tam sayfa önbellekleme rehberindeki ipuçları medyayı S3’e taşıdıktan sonra da işine yarar.

Adım Adım Taşıma: Korkmadan, Küçük Denemelerle

Önce Staging, Sonra Üretim

Gerçek medyayı taşımadan önce küçük bir staging ortamında deney yapmak, bütün riskleri küçültür. Eklentiyi kur, minimal izinlerle erişim anahtarını tanımla, sınırlı bir klasörü kovaya taşı. URL dönüşümünün sayfalarda nasıl göründüğüne bak. Birkaç farklı tarayıcıyla kontrol et; gizli pencerede test etmeyi unutma.

Toplu Senkronizasyon ve CLI

Eğer kütüphanen çok büyükse, eklentinin arayüzü yerine WP-CLI komutlarını ya da S3 uyumlu bir rclone akışını denemek rahatlatır. Büyük dosyaları gece saatlerinde taşımak, trafik ve zamanlama açısından da huzur verir. Tam bu noktada ben her zaman “önce yedek” derim. S3’le çalışıyorsan, uzak yedeklemeyi de S3 uyumlu bir depoda tutmak mantıklı; istersen Restic ve Borg ile S3 uyumlu yedekleme yazımıza bir göz at. Aynı iş aklını hem medya hem yedeklemeye uygularsın.

Günlük Aktarım, Aşamalı Geçiş

Her şeyi bir gecede taşımak zorunda değilsin. Önce yeni yüklemeleri S3’e almaya başla, ardından eski arşivi parça parça geçir. Eklenti “bulunamayan dosya” gibi durumlarda yerel kopyaya düşebiliyorsa, geçiş sırasında kırık link riski de azalır. CDN’i en sonda devreye almak, ilk günlerde hata ayıklamayı kolaylaştırır.

Sorun Giderme: CORS, MIME, Mixed Content ve 403’ler

CORS Küçük Bir Virgül, Ama Eksikse Cümle Düşüyor

Tarayıcı konsolunda “CORS policy” diye bağıran hatalar görürsen, admin paneli içinden yapılan kırpma/yeniden boyutlandırma işlemlerinde veya JS ile çekilen görsellerde CORS’un doğru kurgulanmadığını anlarsın. “GET, HEAD, OPTIONS” izni ve kaynak domain’lere izin vermek çoğu senaryoda yeter. Cache’lenmiş CORS ayarlarının CDN tarafında kalmış olabileceğini unutma; bazen sadece config’i değil, bu cevabı da tazelemek gerekir.

MIME Türleri ve Tarayıcının Keyfi

SVG’nin metin gibi yanlış tipte dönmesi, ya da font dosyalarında cross-origin sorunları… Bu durumlarda doğru Content-Type ve gerekirse Access-Control-Allow-Origin başlıkları oyunu değiştirir. CDN’in “override” ayarlarıyla, belli uzantılar için doğru türleri zorlamak iyi bir fikir. S3 tarafında bazı dosyaların türlerini elle düzenlemek de pratik bir çözüm.

Mixed Content ve 403

HTTPS’e geçtiğin hâlde sayfada http:// ile çağrılan eski görseller karşına çıkabilir. Bu tip durumlarda URL yenileme adımını yeniden gözden geçir. 403 hatalarında ise genellikle izin politikası, imzalı URL süre aşımı veya CDN’in orijine erişim kuralı sorumludur. Küçük bir ipucu: CDN günlüklerini açmak ve hatalı dosyayı birebir takip etmek, bazen saatlerce sürecek tahmini aramayı dakikalara indirir.

Performansı Tadıyla Artıran Küçük Dokunuşlar

HTTP/2 ve HTTP/3, Kenarda Parlıyor

CDN’in zaten bu protokolleri destekliyor olabilir, ama yerel sunucunda da uçtan uca akış istiyorsan ipuçlarına bakmak iyi gelir. Bu konuda, HTTP/2 ve HTTP/3 etkinleştirme rehberindeki adımları uyguladığında görsel, CSS ve JS istekleri çok daha akıcı akar.

Görsel Optimizasyonunu Akışa Dahil Et

Medyan S3’e taşındı diye görsel optimizasyonu rafa kalkmıyor. WebP veya AVIF üretimi, uygun boyutlarda serve etmek ve “lazy-load” davranışı hissedilir fark yaratır. Bazı CDN’ler istek anında dönüştürme sunuyor; bunu aktif ettiğinde orijinal dosyayı büyük bile tutsan uçta hafifletilmiş sürümü servis edebiliyorsun. Yalnız, imzalı URL ve dönüşüm özelliklerini birlikte kurgularken izne dikkat et; özel içeriğin dönüşüm sırasında açığa çıkmaması gerekir.

Güvenlik: Küçük Ayarlar, Büyük Rahatlık

Anahtar Yönetimi ve En Az Yetki

IAM anahtarlarını WordPress’e verirken, “en az yetki” kuralını kendine şiar edin. Sadece gerekli kovaya, sadece gerekli işlemlere izin ver. “Her şeye yetkili anahtar” rahat geliyor gibi görünse de, bir sızıntı anında gereksiz kapılar açar. Çevresel değişkenlerle yönetmek, gizli anahtarları depo dışına taşımak ve erişim günlüğü tutmak içini rahatlatır.

CDN Kenarında Basit Duvarlar

CDN tarafında rate limit, temel WAF kuralları ve belirli yol desenlerine erişim kısıtlaması işe yarar. WordPress sitelerini bot’lardan korumak için pratik öneriler arıyorsan, Cloudflare WAF kuralları ve oran sınırlama rehberindeki fikirler medya isteklerinde de saçma yoğunlukları engellemeyi kolaylaştırır.

Sık Yapılan Hatalar ve Benim Ufak Çözümlerim

“Önce CDN, Sonra Kovayı Açarım” Tersliği

CDN’i kurup köprüleri döşemeden kovayı herkese açmak, geçişte tutarsızlık doğurur. Benim yolum tam tersi: Önce kovayı doğru izinlerle hazırlar, CDN’i araya koyar, sonra kamuya açarım. Böylece URL’ler yayınlandığı anda doğru yoldan akar.

“Cache’i Kapatalım, Dert Bitirir” Yanılgısı

Önbelleği kapatmak kısa vadede “oh be” dedirtir ama uzun vadede maliyet ve hızdan yersin. Asıl kilit, immutable + sürümleme yaklaşımını oturtmak. Dosya adını bilinçli şekilde değiştirdiğinde, CDN ve tarayıcıyla kavga etmezsin.

“Bir Günde Her Şeyi Taşıyacağım” Baskısı

Medya büyükse, acele etmek hata demektir. Aşamalı geçiş, küçük gruplarla deneme ve izleme en sağlıklısı. Eski URL’leri dikkatle yenile, kırık görselleri yakalamak için bir süre log’lara göz kulak ol.

Kapanış: Yolun Sonunda Hafiflemiş Bir Site

Buraya kadar geldiysen, artık resim net. WordPress medyanı S3 uyumlu bir depoya taşımak, sitenin sırtındaki yükü alır; CDN ile hızlanır, imzalı URL ile özel içerik doğru kişide kalır, önbellek stratejisi ile maliyet ve performans dengesi kurulabilir. Hepsi, küçük ve kontrollü adımlarla yapıldığında akıp giden bir akışa dönüşüyor. Bir gün ansızın “Bu site niye hızlandı?” diye soran olursa, gülümser ve “medyayı yoldan çektik” dersin.

Pratik bir kapanış listesi yerine küçük bir hatırlatma bırakayım: Önce staging’de dene, izinleri en aza indir, URL’leri temizce dönüştür, immutable + sürümleme ikilisini alışkanlık yap, gerektiğinde CDN invalidation gönder. Son dokunuş olarak sayfaların kendisindeki önbelleği de unutma; bunun için tam sayfa önbellekleme rehberindeki pratikler güzel tamamlayıcı olur. Hızlı, sakin ve kontrollü geçişler dilerim. Bir sonraki yazıda görüşürüz.

Sıkça Sorulan Sorular

Küçük bir staging ortamı, bir bucket, erişim anahtarları, CORS ayarı ve deneme amaçlı birkaç dosya. Sonrasında eklentiyi kurup kısıtlı bir aktarım yap, URL’lerin düzgün dönüştüğünü teyit et.

Herkese açık görseller için imzalı URL şart değil. CDN ile uzun süreli önbellek ve sürümlenmiş dosya adları en pratik yaklaşım. Özel içeriğin varsa imzalı URL devreye girsin.

Önbellek çalışıyor demek. Dosya adını sürümleyip yenilemek en sağlam yöntem. Aynı isimle kalacaksa, hedeflenen yolu CDN tarafında geçersizleştirip tarayıcı önbelleğini yenilemesini sağla.