Azure CDN Yapılandırması: Kapsamlı Kurulum ve Yönetim Rehberi
Bir web uygulaması deploy etmişsiniz, her şey güzel çalışıyor, ama kullanıcılarınız yavaş yüklenme sürelerinden şikayet ediyor. Özellikle Türkiye dışından erişenler için durum daha da kötü. İşte tam bu noktada CDN (Content Delivery Network) devreye giriyor. Azure CDN, statik içeriklerinizi dünya genelindeki edge node’lara dağıtarak bu problemi kökten çözüyor. Bu yazıda Azure CDN’i sıfırdan yapılandırmayı, optimizasyon ipuçlarını ve gerçek dünya senaryolarını ele alacağız.
Azure CDN Nedir ve Neden Kullanmalısınız
Azure CDN, Microsoft’un global olarak dağıtılmış sunucu ağını kullanarak içeriklerinizi kullanıcılara en yakın konumdan sunmanızı sağlayan bir hizmettir. Temel mantık şu: bir kullanıcı İstanbul’dan erişiyorsa içerik Frankfurt’taki edge node’dan gelir, Londra’dan erişiyorsa Londra’daki node’dan.
CDN’in avantajları sadece hızla sınırlı değil:
- Bant genişliği maliyeti düşer: Origin sunucunuza gelen trafik azalır, CDN edge’leri yükü paylaşır
- Yüksek erişilebilirlik: Origin sunucunuz anlık olarak çökmüş olsa bile cache’deki içerikler servis edilmeye devam eder
- DDoS koruması: Azure CDN, Verizon ve Akamai gibi sağlayıcılarla entegre olarak DDoS saldırılarına karşı koruma sağlar
- HTTPS otomasyonu: Özel domain’leriniz için ücretsiz SSL sertifikası yönetimi
- Geo-filtering: İçeriklere ülke bazlı erişim kontrolü
Azure CDN şu anda dört farklı ürün üzerinden sunuluyor: Azure CDN Standard from Microsoft, Azure CDN Standard from Akamai, Azure CDN Standard from Verizon ve Azure CDN Premium from Verizon. Microsoft’un kendi CDN’i yeni projeler için önerilen seçenek, ancak bazı gelişmiş özellikler için Verizon Premium tercih edilebilir.
Ön Gereksinimler
Başlamadan önce şunlara ihtiyacınız var:
- Aktif bir Azure aboneliği
- Azure CLI kurulu ve login yapılmış
- Bir storage account veya web sunucusu (origin olarak kullanacağız)
- Opsiyonel: Özel bir domain adı
Azure CLI kurulu değilse hızlıca yükleyebilirsiniz:
# Ubuntu/Debian için
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
# Login
az login
# Aboneliği doğrulayın
az account show
Resource Group ve Storage Account Oluşturma
Gerçek dünya senaryosu olarak bir e-ticaret sitesinin statik dosyalarını (JS, CSS, resimler) CDN üzerinden dağıtacağız. Önce kaynak gruplarımızı ve storage account’umuzu oluşturalım.
# Değişkenler tanımlayalım
RESOURCE_GROUP="rg-ecommerce-cdn"
LOCATION="westeurope"
STORAGE_ACCOUNT="stecommercefiles001"
CDN_PROFILE="cdn-ecommerce-profile"
CDN_ENDPOINT="cdn-ecommerce-endpoint"
# Resource group oluştur
az group create
--name $RESOURCE_GROUP
--location $LOCATION
# Storage account oluştur (statik web sitesi hosting için)
az storage account create
--name $STORAGE_ACCOUNT
--resource-group $RESOURCE_GROUP
--location $LOCATION
--sku Standard_LRS
--kind StorageV2
--allow-blob-public-access true
# Storage account'ta statik web sitesi özelliğini etkinleştir
az storage blob service-properties update
--account-name $STORAGE_ACCOUNT
--static-website
--index-document "index.html"
--404-document "404.html"
Storage account hazır. Şimdi bir CDN Profile oluşturalım. CDN Profile, endpoint’leri barındıran üst düzey kaynaktır.
CDN Profile ve Endpoint Oluşturma
# CDN Profile oluştur (Microsoft Standard kullanıyoruz)
az cdn profile create
--name $CDN_PROFILE
--resource-group $RESOURCE_GROUP
--location $LOCATION
--sku Standard_Microsoft
# Storage account'un web endpoint URL'ini al
ORIGIN_URL=$(az storage account show
--name $STORAGE_ACCOUNT
--resource-group $RESOURCE_GROUP
--query "primaryEndpoints.web"
--output tsv | sed 's|https://||' | sed 's|/||')
echo "Origin URL: $ORIGIN_URL"
# CDN Endpoint oluştur
az cdn endpoint create
--name $CDN_ENDPOINT
--profile-name $CDN_PROFILE
--resource-group $RESOURCE_GROUP
--location $LOCATION
--origin $ORIGIN_URL
--origin-host-header $ORIGIN_URL
--enable-compression true
--query-string-caching-behavior IgnoreQueryString
Endpoint oluşturulduktan sonra birkaç dakika içinde aktif hale gelir. Endpoint URL’iniz https://cdn-ecommerce-endpoint.azureedge.net formatında olacaktır.
Dosyaları Upload Etme ve Test
Storage account’a örnek dosyalar yükleyip CDN üzerinden erişimi test edelim:
# Örnek dosyalar oluştur
mkdir -p /tmp/static-assets/{css,js,images}
echo "body { margin: 0; font-family: Arial; }" > /tmp/static-assets/css/main.css
echo "console.log('App loaded');" > /tmp/static-assets/js/app.js
echo "<html><body><h1>Hello CDN</h1></body></html>" > /tmp/static-assets/index.html
# Dosyaları storage'a yükle
az storage blob upload-batch
--account-name $STORAGE_ACCOUNT
--destination '$web'
--source /tmp/static-assets
--content-cache-control "public, max-age=31536000"
--overwrite true
# CDN endpoint'i test et
CDN_URL="https://${CDN_ENDPOINT}.azureedge.net"
curl -I "${CDN_URL}/index.html"
Curl çıktısında X-Cache: TCP_HIT veya X-Cache: TCP_MISS headerlarını göreceksiniz. İlk istekte MISS, sonraki isteklerde HIT geliyorsa CDN düzgün çalışıyor demektir.
Cache Kuralları ve TTL Yapılandırması
Varsayılan cache davranışı çoğu zaman yeterli olmaz. Farklı dosya tipleri için farklı cache süresi belirlemek gerekir. Örneğin JS ve CSS dosyaları versiyonlama ile yönetildiği için uzun süre cache’de kalabilir, ama HTML dosyaları daha sık güncellenebilir.
# Delivery rule ile CSS ve JS için uzun cache süresi ayarla
az cdn endpoint rule add
--resource-group $RESOURCE_GROUP
--profile-name $CDN_PROFILE
--endpoint-name $CDN_ENDPOINT
--name "LongCacheForAssets"
--order 1
--match-variable UrlFileExtension
--operator Equal
--match-values "css" "js" "woff2" "woff" "ttf"
--action-name CacheExpiration
--cache-behavior Override
--cache-duration "365.00:00:00"
# HTML dosyaları için kısa cache süresi
az cdn endpoint rule add
--resource-group $RESOURCE_GROUP
--profile-name $CDN_PROFILE
--endpoint-name $CDN_ENDPOINT
--name "ShortCacheForHTML"
--order 2
--match-variable UrlFileExtension
--operator Equal
--match-values "html" "htm"
--action-name CacheExpiration
--cache-behavior Override
--cache-duration "0.00:05:00"
Özel Domain ve HTTPS Yapılandırması
Gerçek bir üretim ortamında CDN endpoint’inizi kendi domain adınızla kullanmak isteyeceksiniz. Örneğin assets.eticaret.com gibi bir subdomain.
# Önce DNS tarafında CNAME kaydı oluşturmanız gerekiyor
# DNS sağlayıcınızda şu kaydı ekleyin:
# assets.eticaret.com CNAME cdn-ecommerce-endpoint.azureedge.net
# CNAME yayılımını doğrulayın
nslookup assets.eticaret.com
# Özel domain'i CDN endpoint'e ekle
az cdn custom-domain create
--resource-group $RESOURCE_GROUP
--profile-name $CDN_PROFILE
--endpoint-name $CDN_ENDPOINT
--name "eticaret-assets"
--hostname "assets.eticaret.com"
# Azure yönetimli SSL sertifikası etkinleştir
az cdn custom-domain enable-https
--resource-group $RESOURCE_GROUP
--profile-name $CDN_PROFILE
--endpoint-name $CDN_ENDPOINT
--name "eticaret-assets"
SSL sertifikası otomatik olarak oluşturulur ve 6-8 saat içinde aktif hale gelir. Sertifika yenileme de otomatik yapılır, elle müdahale gerekmez. Bu özellik özellikle küçük ekipler için büyük bir kolaylık.
Geo-Filtering ile Coğrafi Kısıtlama
Bazı durumlarda belirli ülkelerden erişimi engellemek veya sadece belirli ülkelere izin vermek gerekebilir. Lisanslama gereksinimleri veya uyumluluk nedenleriyle bu gereksinim sıklıkla karşıma çıkıyor.
# Belirli bir yola sadece belirtilen ülkelerden erişime izin ver
# Örnek: /premium-content yoluna sadece TR, DE, GB erişebilsin
az cdn endpoint rule add
--resource-group $RESOURCE_GROUP
--profile-name $CDN_PROFILE
--endpoint-name $CDN_ENDPOINT
--name "GeoRestriction"
--order 3
--match-variable RemoteAddress
--operator GeoMatch
--negate-condition true
--match-values "TR" "DE" "GB"
--action-name UrlRedirect
--redirect-type Found
--redirect-protocol Https
--destination-hostname "www.eticaret.com"
--destination-path "/access-denied"
Cache Purge (Önbellek Temizleme)
Yeni bir deployment yaptınız ama CDN hala eski dosyaları servis ediyor. Bu sysadminlerin en çok canını sıkan durumlardan biri. Cache purge ile bu sorunu anında çözebilirsiniz:
# Belirli bir dosyayı purge et
az cdn endpoint purge
--resource-group $RESOURCE_GROUP
--profile-name $CDN_PROFILE
--name $CDN_ENDPOINT
--content-paths "/css/main.css" "/js/app.js"
# Tüm cache'i temizle (dikkatli kullanın, origin'e yük bindirir)
az cdn endpoint purge
--resource-group $RESOURCE_GROUP
--profile-name $CDN_PROFILE
--name $CDN_ENDPOINT
--content-paths "/*"
# Purge işleminin durumunu kontrol et
az cdn endpoint show
--resource-group $RESOURCE_GROUP
--profile-name $CDN_PROFILE
--name $CDN_ENDPOINT
--query "resourceState"
Önemli Not: Wildcard purge (/*) işlemi tüm edge node’lardan cache’i temizler ve bu işlem tamamlanana kadar tüm istekler origin’e gider. Yüksek trafikli sitelerde bu durum origin sunucularınızı zorlayabilir. Mümkünse sadece değişen dosyaları purge edin.
CI/CD Pipeline ile Entegrasyon
Gerçek dünyada CDN yapılandırması tek seferlik bir iş değil. Her deployment sonrası cache temizleme işlemini otomatize etmek gerekiyor. İşte GitHub Actions ile entegrasyon örneği:
# Bu script'i deployment pipeline'ınıza ekleyin
# deploy-and-purge.sh
#!/bin/bash
set -e
RESOURCE_GROUP="rg-ecommerce-cdn"
CDN_PROFILE="cdn-ecommerce-profile"
CDN_ENDPOINT="cdn-ecommerce-endpoint"
STORAGE_ACCOUNT="stecommercefiles001"
BUILD_DIR="./dist"
echo "=== Dosyalar upload ediliyor ==="
az storage blob upload-batch
--account-name $STORAGE_ACCOUNT
--destination '$web'
--source $BUILD_DIR
--overwrite true
--output none
echo "=== Versiyon bazlı asset'lar için uzun cache header'ı ekleniyor ==="
# Hash içeren dosyalar için (örn: main.a1b2c3.js)
az storage blob update
--account-name $STORAGE_ACCOUNT
--container-name '$web'
--name "index.html"
--content-cache-control "no-cache, must-revalidate"
echo "=== HTML dosyaları için cache purge yapılıyor ==="
az cdn endpoint purge
--resource-group $RESOURCE_GROUP
--profile-name $CDN_PROFILE
--name $CDN_ENDPOINT
--content-paths "/*.html" "/index.html"
--no-wait
echo "=== Deployment tamamlandı ==="
echo "CDN URL: https://${CDN_ENDPOINT}.azureedge.net"
Monitoring ve Alerting
CDN’i kurup bırakmak olmaz. Sürekli izlemek gerekiyor. Azure Monitor ile temel metrikleri takip edebilirsiniz:
# CDN endpoint için mevcut metrikleri listele
az monitor metrics list-definitions
--resource "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Cdn/profiles/${CDN_PROFILE}/endpoints/${CDN_ENDPOINT}"
--query "[].name.value"
--output table
# Son 1 saatteki istek sayısını görüntüle
az monitor metrics list
--resource "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Cdn/profiles/${CDN_PROFILE}/endpoints/${CDN_ENDPOINT}"
--metric "RequestCount"
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ)
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ)
--interval PT5M
--output table
# Cache hit oranını kontrol et
az monitor metrics list
--resource "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Cdn/profiles/${CDN_PROFILE}/endpoints/${CDN_ENDPOINT}"
--metric "CacheHitRatio"
--start-time $(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ)
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ)
--interval PT1H
--output table
Cache hit oranı düşükse (yüzde 70’in altındaysa) bir sorun var demektir. Bu durumda şunları kontrol edin:
- Query string cache davranışı: URL’lerde sürekli değişen query string’ler cache’i bypass edebilir
- Vary header’ları: Origin sunucunuz farklı Vary header’ları döndürüyorsa cache verimliliği düşer
- Cache-Control header’ları: Origin’den gelen
no-cacheveyano-storeheader’ları CDN’in cache yapmasını engeller - TTL değerleri: Çok kısa TTL değerleri sık cache expiration’a yol açar
Sık Karşılaşılan Sorunlar ve Çözümleri
Problem: CDN endpoint 404 dönüyor ama origin’de dosya var
Bu genellikle origin host header yapılandırmasından kaynaklanır. Azure Storage static website kullanırken özellikle dikkat edin:
# Origin host header'ını doğru şekilde ayarlayın
az cdn endpoint update
--resource-group $RESOURCE_GROUP
--profile-name $CDN_PROFILE
--name $CDN_ENDPOINT
--origin-host-header "${STORAGE_ACCOUNT}.z6.web.core.windows.net"
Problem: HTTPS yönlendirmesi çalışmıyor
# HTTP'den HTTPS'e yönlendirme kuralı ekle
az cdn endpoint rule add
--resource-group $RESOURCE_GROUP
--profile-name $CDN_PROFILE
--endpoint-name $CDN_ENDPOINT
--name "HttpsRedirect"
--order 1
--match-variable RequestScheme
--operator Equal
--match-values HTTP
--action-name UrlRedirect
--redirect-type MovedPermanently
--redirect-protocol Https
Problem: CORS hataları alıyorum
CDN üzerinden farklı bir domain’den içerik yükleniyorsa CORS header’larının CDN tarafından iletilmesi gerekir. Storage account tarafında CORS ayarlayın:
az storage cors add
--account-name $STORAGE_ACCOUNT
--services b
--methods GET HEAD OPTIONS
--origins "https://www.eticaret.com"
--allowed-headers "*"
--exposed-headers "*"
--max-age 3600
Maliyet Optimizasyonu
CDN maliyeti temel olarak iki bileşenden oluşur: transfer edilen veri miktarı ve HTTP istek sayısı. Maliyeti düşürmek için:
- Sıkıştırmayı mutlaka etkinleştirin:
--enable-compression trueparametresi ile metin tabanlı dosyalar otomatik sıkıştırılır, transfer edilen veri yüzde 70’e kadar azalabilir - Uzun TTL değerleri kullanın: Statik asset’lar için 1 yıllık cache süresi ideal, her zaman dosya isimine hash ekleyerek versiyonlama yapın
- Küçük dosyaları birleştirin: Çok sayıda küçük dosya yerine bundle’lanmış dosyalar kullanmak istek sayısını azaltır
- Görüntüleri optimize edin: CDN’e upload etmeden önce görüntüleri WebP formatına dönüştürün
- Bölge seçimi: Kullanıcılarınız ağırlıklı olarak Avrupa’daysa West Europe veya North Europe bölgesini origin olarak seçmek daha ekonomik olabilir
Sonuç
Azure CDN, doğru yapılandırıldığında hem kullanıcı deneyimini hem de altyapı maliyetlerini iyileştiren güçlü bir araç. Bu yazıda ele aldığımız konuları özetleyecek olursak:
- Storage account ile entegre basit bir CDN kurulumu yaptık
- Cache kuralları ve TTL değerlerini ihtiyaca göre özelleştirdik
- Özel domain ve otomatik HTTPS yönetimini yapılandırdık
- Geo-filtering ile coğrafi kısıtlamalar ekledik
- CI/CD pipeline’ına cache purge entegrasyonu yaptık
- Monitoring ile cache hit oranını takip etmeyi öğrendik
CDN’i kurmanın en zor kısmı teknik yapılandırma değil, cache stratejisini doğru belirlemek. “Her şeyi sonsuz süre cache’le” demek de, “hiçbir şeyi cache’leme” demek de yanlış. Dosya tiplerine göre farklı stratejiler belirleyin, versiyonlama kullanın ve düzenli olarak cache hit oranınızı takip edin.
Bir sonraki adım olarak Azure Front Door ile daha gelişmiş trafik yönetimi ve WAF entegrasyonunu incelemenizi öneririm. Özellikle çoklu region’da çalışan uygulamalar için Front Door, CDN’in ötesinde akıllı yük dengeleme ve failover özellikleri sunuyor.
