Cloudflare Always Online ile Site Kesinti Koruması

Siteniz bir gün aniden çökse ve ziyaretçileriniz “Bu siteye ulaşılamıyor” hatasıyla karşılaşsa ne olur? Gelir kaybı, marka itibarı zedelenmesi, SEO puanlarının düşmesi… Bunların hepsini yaşamamak için Cloudflare’in Always Online özelliği tam olarak ihtiyacınız olan şey. Bu yazıda Always Online’ı sıfırdan kuruyoruz, arka planda nasıl çalıştığını anlıyoruz ve gerçek dünya senaryolarında nasıl kullanacağınızı gösteriyoruz.

Always Online Nedir ve Nasıl Çalışır?

Cloudflare Always Online, köken sunucunuz (origin server) erişilemez duruma düştüğünde ziyaretçilerinize sitenizin önbelleğe alınmış bir sürümünü sunan bir kesinti koruma mekanizmasıdır. Temel mantık şu: Cloudflare sitenizi sürekli tarar, sayfalarınızın anlık görüntülerini alır ve sunucunuz yanıt vermediğinde bu önbelleği devreye sokar.

Bunun yanı sıra Cloudflare, Internet Archive (Wayback Machine) ile de entegre çalışır. Eğer Cloudflare’in kendi önbelleğinde güncel bir kopya yoksa, Archive.org’dan sitenizin eski bir versiyonunu çekip ziyaretçiye gösterebilir.

Teknik açıdan bakınca Always Online şu adımları izler:

  • Cloudflare edge sunucuları köken sunucuya istek gönderir
  • Sunucu 503, 502, 504 gibi hata kodları döndürürse veya hiç yanıt vermezse
  • Cloudflare önce kendi önbelleğini kontrol eder
  • Yerel önbellekte sayfa yoksa Internet Archive’e sorgu atar
  • Ziyaretçiye sınırlı işlevsellikte de olsa bir sayfa gösterilir

Önemli bir not: Always Online dinamik içerikler için çalışmaz. Giriş sayfaları, ödeme sistemleri, AJAX istekleri gibi sunucu tarafında işlem gerektiren şeyler önbellekten sunulamaz. Bu özellik özellikle statik içerik ağırlıklı siteler, bloglar ve kurumsal tanıtım siteleri için idealdir.

Cloudflare DNS Panelinden Always Online Aktivasyonu

Önce temel kurulumu yapalım. Cloudflare hesabınıza giriş yapın ve ilgili domain’i seçin.

# Cloudflare API üzerinden Always Online durumunu kontrol etmek için
curl -X GET "https://api.cloudflare.com/client/v4/zones/{zone_id}/settings/always_online" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_ANAHTARINIZ" 
  -H "Content-Type: application/json"

Panelden aktif etmek yerine API ile yönetmek isteyenler için etkinleştirme komutu:

# Always Online özelliğini API ile aktif etmek
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/{zone_id}/settings/always_online" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_ANAHTARINIZ" 
  -H "Content-Type: application/json" 
  --data '{"value":"on"}'

Panel üzerinden yapıyorsanız yol şu: Caching > Configuration > Always Online bölümüne gidin ve toggle’ı açık konuma getirin. Bu kadar basit. Ancak sadece bu kadarla kalırsanız Always Online’ı yarım bırakmış olursunuz. Asıl iş önbellek stratejisini doğru kurmakta yatıyor.

Önbellek Kurallarını Optimize Etmek

Always Online’ın etkin çalışması için Cloudflare’in sayfalarınızı düzenli olarak önbelleğe alması gerekir. Bunun için Cache Rules (eski adıyla Page Rules) bölümünden agresif bir önbellek politikası kurmanız şarttır.

# Cloudflare API ile Cache Everything kuralı oluşturma
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/pagerules" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_ANAHTARINIZ" 
  -H "Content-Type: application/json" 
  --data '{
    "targets": [
      {
        "target": "url",
        "constraint": {
          "operator": "matches",
          "value": "*siteniz.com/*"
        }
      }
    ],
    "actions": [
      {
        "id": "cache_level",
        "value": "cache_everything"
      },
      {
        "id": "edge_cache_ttl",
        "value": 86400
      }
    ],
    "status": "active",
    "priority": 1
  }'

Burada edge_cache_ttl değerini 86400 saniye (24 saat) olarak ayarladık. Bu değeri sitenizin güncelleme sıklığına göre düzenleyebilirsiniz. Sık güncellenen bir haber sitesiyseniz bu değeri düşürün, ayda bir güncellenen kurumsal bir siteyseniz yüksek tutabilirsiniz.

Browser Cache TTL Ayarı

Sunucu tarafı önbelleğin yanı sıra tarayıcı önbelleğini de yapılandırmak önemlidir:

# Browser Cache TTL'i API ile ayarlama
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/{zone_id}/settings/browser_cache_ttl" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_ANAHTARINIZ" 
  -H "Content-Type: application/json" 
  --data '{"value": 14400}'

Nginx Sunucusunu Always Online ile Uyumlu Hale Getirme

Always Online’ın düzgün çalışması için köken sunucunuzun da Cloudflare ile uyumlu HTTP başlıkları göndermesi gerekir. Nginx konfigürasyonunuzu şu şekilde ayarlayabilirsiniz:

server {
    listen 80;
    server_name siteniz.com www.siteniz.com;

    # Cloudflare Always Online için Cache-Control başlıkları
    location ~* .(html|htm)$ {
        expires 1h;
        add_header Cache-Control "public, max-age=3600, s-maxage=86400";
        add_header Cloudflare-CDN-Cache-Control "max-age=86400";
    }

    location ~* .(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, max-age=2592000, immutable";
    }

    # Dinamik içerikler için cache bypass
    location ~* .(php)$ {
        add_header Cache-Control "no-store, no-cache, must-revalidate";
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Bu yapılandırmada HTML sayfaları için Cloudflare edge sunucularında 24 saat tutulacak şekilde önbellek direktifleri ekledik. Statik kaynaklar için ise 30 günlük agresif bir önbellek süresi belirledik.

Apache için Always Online Uyumlu Konfigürasyon

Apache kullananlar için .htaccess veya VirtualHost konfigürasyonu:

<VirtualHost *:80>
    ServerName siteniz.com

    # Cloudflare Always Online uyumlu cache başlıkları
    <FilesMatch ".(html|htm)$">
        Header set Cache-Control "public, max-age=3600, s-maxage=86400"
        Header set Surrogate-Control "max-age=86400"
    </FilesMatch>

    <FilesMatch ".(css|js|png|jpg|jpeg|gif|ico|svg)$">
        Header set Cache-Control "public, max-age=2592000, immutable"
        ExpiresActive On
        ExpiresDefault "access plus 30 days"
    </FilesMatch>

    # PHP ve dinamik içerik için cache kapatma
    <FilesMatch ".php$">
        Header set Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate"
        Header set Pragma "no-cache"
    </FilesMatch>
</VirtualHost>

Gerçek Dünya Senaryosu: Sunucu Bakımında Sitenin Ayakta Tutulması

Diyelim ki bir e-ticaret sitesi işletiyorsunuz ve her Pazar gece 02:00-04:00 arası bakım yapıyorsunuz. Bu sürede ziyaretçi trafiği düşük olsa da tamamen sıfır değil. Always Online’ı bu senaryo için optimize etmek şu şekilde mümkün:

Bakım öncesi manuel önbellek ısıtma (cache warming) yapabilirsiniz:

#!/bin/bash
# cache_warm.sh - Bakım öncesi kritik sayfaları önbelleğe al

SITE_URL="https://siteniz.com"
PAGES=(
    "/"
    "/hakkimizda"
    "/iletisim"
    "/urunler"
    "/blog"
)

echo "Cloudflare önbellek ısıtma başlıyor..."

for page in "${PAGES[@]}"; do
    FULL_URL="${SITE_URL}${page}"
    HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" 
        -H "User-Agent: Mozilla/5.0 (compatible; CacheWarmer/1.0)" 
        "$FULL_URL")
    
    if [ "$HTTP_CODE" = "200" ]; then
        echo "OK: $FULL_URL önbelleğe alındı"
    else
        echo "HATA: $FULL_URL - HTTP $HTTP_CODE"
    fi
    
    # Rate limiting'e takılmamak için kısa bekleme
    sleep 0.5
done

echo "Önbellek ısıtma tamamlandı!"

Bu scripti cron job olarak bakımdan 1 saat önce çalıştırabilirsiniz:

# Crontab satırı - Pazar 01:00'de cache warming
0 1 * * 0 /usr/local/bin/cache_warm.sh >> /var/log/cache_warm.log 2>&1

Cloudflare Workers ile Gelişmiş Always Online Senaryoları

Cloudflare Workers kullanarak Always Online davranışını özelleştirebilirsiniz. Örneğin sunucu çevrimdışıyken ziyaretçilere özel bir bakım sayfası göstermek isteyebilirsiniz:

// Cloudflare Worker - Özel kesinti sayfası
addEventListener('fetch', event => {
    event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
    try {
        const response = await fetch(request, {
            cf: {
                cacheTtl: 86400,
                cacheEverything: true,
            }
        })
        
        // Sunucu hata döndürüyorsa özel sayfa göster
        if (response.status === 503 || response.status === 502 || response.status === 504) {
            return new Response(getMaintenancePage(), {
                status: 503,
                headers: {
                    'Content-Type': 'text/html; charset=utf-8',
                    'Retry-After': '3600',
                    'Cache-Control': 'no-store',
                }
            })
        }
        
        return response
    } catch (e) {
        // Ağ hatası - sunucuya ulaşılamıyor
        return new Response(getMaintenancePage(), {
            status: 503,
            headers: {
                'Content-Type': 'text/html; charset=utf-8',
            }
        })
    }
}

function getMaintenancePage() {
    return `<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <title>Geçici Bakım</title>
    <style>
        body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }
        h1 { color: #e74c3c; }
    </style>
</head>
<body>
    <h1>Kısa Süreliğine Bakımdayız</h1>
    <p>Siteniz en kısa sürede tekrar hizmetinizde olacak.</p>
</body>
</html>`
}

Always Online Durumunu İzleme ve Loglama

Sitenizin Always Online moduna girip girmediğini izlemek için Cloudflare Analytics API’sini kullanabilirsiniz:

#!/bin/bash
# always_online_monitor.sh - Always Online olaylarını takip et

ZONE_ID="zone_id_buraya"
API_KEY="api_key_buraya"
EMAIL="[email protected]"
SLACK_WEBHOOK="https://hooks.slack.com/services/XXXXX"

# Son 1 saatteki hata oranını kontrol et
ANALYTICS=$(curl -s -X GET 
  "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/analytics/dashboard?since=-60&until=0" 
  -H "X-Auth-Email: ${EMAIL}" 
  -H "X-Auth-Key: ${API_KEY}" 
  -H "Content-Type: application/json")

# 5xx hata sayısını parse et
ERROR_COUNT=$(echo $ANALYTICS | python3 -c "
import sys, json
data = json.load(sys.stdin)
totals = data.get('result', {}).get('totals', {})
requests = totals.get('requests', {})
print(requests.get('http_status', {}).get('503', 0))
")

echo "Son 1 saatte 503 hata sayısı: $ERROR_COUNT"

# Eşik değer aşılırsa Slack bildirimi gönder
if [ "$ERROR_COUNT" -gt 10 ]; then
    curl -s -X POST "$SLACK_WEBHOOK" 
        -H 'Content-type: application/json' 
        --data "{"text":"UYARI: Son 1 saatte $ERROR_COUNT adet 503 hatası tespit edildi. Always Online devrede olabilir!"}"
fi

Always Online’ın Sınırlılıkları ve Çözüm Yolları

Always Online her derde deva değil. Şu durumların farkında olmanız gerekiyor:

Dinamik içerik problemi: WordPress sitenizde kullanıcı girişi, yorum gönderme gibi işlemler Always Online modunda çalışmaz. Bu durumda ziyaretçilere açıklayıcı bir mesaj göstermek için WP-Config’e şunu ekleyebilirsiniz:

<?php
// wp-config.php'ye ekleyin
// Cloudflare Always Online durumunda dinamik işlemleri devre dışı bırak
if (isset($_SERVER['HTTP_CF_CACHE_STATUS']) && 
    $_SERVER['HTTP_CF_CACHE_STATUS'] === 'STALE') {
    define('DISALLOW_FILE_MODS', true);
    // Ödeme sayfalarına erişimi engelle
    if (strpos($_SERVER['REQUEST_URI'], '/checkout') !== false) {
        wp_die('Sistem geçici olarak bakımda. Lütfen birkaç dakika sonra tekrar deneyin.');
    }
}

Önbellek boşluğu problemi: Cloudflare hiç ziyaret edilmemiş veya çok eski olan sayfaları önbelleğinde tutmayabilir. Bu durumda sitemap’inizi kullanarak tüm sayfaları periyodik olarak önbelleğe alan bir script işinizi görür:

#!/bin/bash
# sitemap_crawler.sh - Sitemap'teki tüm URL'leri önbelleğe al

SITEMAP_URL="https://siteniz.com/sitemap.xml"

# Sitemap'ten URL'leri çek
URLS=$(curl -s "$SITEMAP_URL" | grep -oP '(?<=<loc>)[^<]+')

TOTAL=$(echo "$URLS" | wc -l)
COUNTER=0

echo "Toplam $TOTAL URL önbelleğe alınacak..."

while IFS= read -r url; do
    COUNTER=$((COUNTER + 1))
    HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" 
        --max-time 10 
        -H "User-Agent: CloudflareCacheWarmer/1.0" 
        "$url")
    
    echo "[$COUNTER/$TOTAL] $HTTP_CODE - $url"
    sleep 0.3
done <<< "$URLS"

echo "İşlem tamamlandı. $TOTAL URL işlendi."

SSL ve HTTPS ile Always Online Uyumu

Always Online, HTTPS ile çalışan sitelerde ekstra dikkat gerektirir. Özellikle sertifika sorunları yaşanan durumlarda Cloudflare’in köken sunucuya bağlanamaması Always Online’ı gereksiz yere tetikleyebilir.

Cloudflare SSL modunun doğru ayarlandığından emin olun:

  • Flexible: Köken sunucuda SSL olmasa bile çalışır ama güvenli değil
  • Full: Köken sunucuda self-signed sertifika bile olsa çalışır
  • Full (Strict): Geçerli bir SSL sertifikası zorunlu, önerilen mod bu

SSL modunu API ile kontrol etmek için:

# Mevcut SSL modunu sorgula
curl -X GET "https://api.cloudflare.com/client/v4/zones/{zone_id}/settings/ssl" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_ANAHTARINIZ" 
  -H "Content-Type: application/json"

# Full Strict moduna geç
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/{zone_id}/settings/ssl" 
  -H "X-Auth-Email: [email protected]" 
  -H "X-Auth-Key: API_ANAHTARINIZ" 
  -H "Content-Type: application/json" 
  --data '{"value":"strict"}'

Always Online ile Birlikte Kullanılması Gereken Özellikler

Always Online tek başına yeterli değil. Maksimum kesinti koruması için şu Cloudflare özelliklerini de aktif edin:

Argo Smart Routing: Cloudflare’in akıllı yönlendirmesini aktif ederek köken sunucuya giden trafiğin en hızlı rotadan geçmesini sağlayın. Bu, geçici ağ sorunlarında paketlerin kaybolmasını önler.

Health Checks: Cloudflare’in köken sunucunuzu periyodik olarak kontrol etmesini sağlayın. Sorun tespit edildiğinde anında bildirim alırsınız.

Load Balancing: Birden fazla sunucunuz varsa Load Balancer kullanın. Bir sunucu çöktüğünde trafik otomatik olarak diğerine yönlendirilir. Always Online bu durumda son savunma hattı olarak kalır.

DDoS Protection: Cloudflare’in DDoS koruması aktifse yoğun saldırılar sırasında sunucunuz yüklenmez, dolayısıyla Always Online’ı tetikleme ihtimali azalır.

Sorun Giderme: Always Online Neden Çalışmıyor?

Sık karşılaşılan sorunlar ve çözümleri:

Sorun 1: Sayfalar önbellekten sunulmuyor

Cloudflare’in bir sayfayı önbelleğe alıp almadığını kontrol etmek için response header’larına bakın. CF-Cache-Status: HIT görüyorsanız önbellekten geliyor, MISS görüyorsanız önbelleğe alınmamış demektir.

# Bir sayfanın önbellek durumunu kontrol et
curl -s -I "https://siteniz.com/" | grep -i "cf-cache-status"

# Daha detaylı header analizi
curl -v "https://siteniz.com/" 2>&1 | grep -i "cf-"

Sorun 2: Origin sunucu Cloudflare olmadan erişilebilir

Eğer sunucunuzun IP’si gizli değilse saldırganlar Cloudflare’i atlayarak direkt sunucunuza yüklenebilir. Nginx’te sadece Cloudflare IP’lerinden gelen isteklere izin verin:

# Cloudflare IP listesini al ve Nginx'e ekle
curl -s https://www.cloudflare.com/ips-v4 > /etc/nginx/cloudflare-ips.conf

# nginx.conf'a ekle
# allow 173.245.48.0/20; (Cloudflare IP ranges)
# deny all;

Sorun 3: Cache-Control: no-store header’ı

Eğer köken sunucunuz Cache-Control: no-store başlığı gönderiyorsa Cloudflare bu sayfayı önbelleğe almaz, dolayısıyla Always Online çalışmaz. Sunucu konfigürasyonunuzu kontrol edin ve dinamik olmayan sayfaların cacheable olduğundan emin olun.

Sonuç

Cloudflare Always Online, özellikle küçük ve orta ölçekli web siteleri için neredeyse sıfır maliyetle elde edebileceğiniz güçlü bir kesinti koruma mekanizması. Ancak “aktif et ve unut” mantığıyla çalışmıyor. Düzgün bir önbellek stratejisi, sunucu tarafında doğru HTTP başlıkları ve periyodik cache warming işlemleri olmadan Always Online’dan istediğiniz verimi alamazsınız.

Özetlemek gerekirse yapmanız gerekenler şunlar: Always Online’ı Cloudflare panelinden aktif edin, Cache Rules ile agresif bir önbellek politikası kurun, sunucu konfigürasyonunuzda uygun Cache-Control başlıklarını ayarlayın, kritik sayfaları önbelleğe alan bir cron job çalıştırın ve SSL modunuzun Full Strict olduğundan emin olun.

Ekstra güvenlik için Load Balancing ve Health Checks eklerseniz Always Online gerçekten son çare olarak kalır ve çoğu kesintide devreye bile girmez. Ama devreye girdiğinde hayat kurtarır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir