Teknoloji

Varnish Cache ile Nginx/Apache Önüne Reverse Proxy Kurulumu ve Performans Kazançları

İçindekiler

Varnish Cache ile Reverse Proxy Mimarisi Neden Bu Kadar Fark Yaratıyor?

Bir web projesi için kapasite planlama toplantısında en sık gelen sorulardan biri şudur: “Mevcut Nginx/Apache kurulumumuzla ne kadar daha trafik kaldırabiliriz?” CPU, RAM, disk I/O ve veritabanı optimizasyonları elbette önemli; ancak dinamik PHP tabanlı sitelerde asıl farkı çoğu zaman tam sayfa önbellekleme yaratır. İşte burada Varnish Cache devreye girer.

Varnish, Nginx veya Apache’nin önünde çalışan, HTTP trafiği için özel olarak tasarlanmış, son derece hızlı bir reverse proxy ve cache sunucusudur. Doğru kurgulandığında TTFB’yi (Time To First Byte) milisaniye seviyelerine çekebilir, PHP-FPM ve veritabanı yükünü dramatik biçimde azaltabilir ve aynı donanımla saniyede kat kat fazla isteği karşılamanıza izin verir. DCHost altyapısında yüksek trafikli WordPress, WooCommerce ve Laravel projelerinde yıllardır sahada uyguladığımız en etkili performans kaldıraçlarından biri tam olarak budur.

Bu rehberde Varnish Cache ile Nginx veya Apache’nin önüne reverse proxy kurulumunu, gerçekçi mimari seçeneklerini, tipik VCL (Varnish Configuration Language) ayarlarını, WordPress/WooCommerce için dikkat edilmesi gereken nüansları ve pratik performans kazanımlarını adım adım ele alacağız. Yazının sonunda, tek bir NVMe VPS üzerinde bile önbellek vuruş oranı (cache hit ratio) yüksek, TTFB’si düşük ve trafik patlamalarına karşı çok daha dayanıklı bir mimariyi rahatlıkla kurabilecek seviyeye geleceksiniz.

Varnish Cache Nedir, Nginx/Apache ile Roller Nasıl Ayrılır?

Varnish’i doğru anlamadan sağlıklı bir kurulum tasarlamak zordur. Varnish bir web sunucusu değil, HTTP reverse proxy ve tam sayfa önbellek motorudur. Statik dosyaları da sunabilir; ama esas gücü, dinamik sayfaların sonucunu bellek üzerinde tutarak aynı isteklere tekrar tekrar cevap vermesindedir.

Temel rol dağılımı

  • Varnish: İstemcinin (tarayıcı, mobil uygulama, bot vb.) ilk temas ettiği katmandır. HTTP isteklerini karşılar, mümkünse önbellekten (cache) yanıtlar, değilse arkadaki Nginx/Apache’ye iletir.
  • Nginx/Apache (backend/origin): PHP-FPM, uygulama kodu (WordPress, Laravel, Magento vb.) ve veritabanı ile konuşan asıl uygulama sunucusudur.

Akış kabaca şöyledir:

  • Tarayıcı GET / isteğini gönderir.
  • Varnish isteği alır, HTTP header’lara, URL’ye, çerezlere ve tanımlı VCL kurallarına bakarak bu isteğin cache’ten karşılanıp karşılanamayacağına karar verir.
  • Eğer daha önce aynı içeriği önbelleğe aldıysa, cevabı RAM’den milisaniyeler içinde döner (cache hit).
  • Önbellekte yoksa veya önbelleklenemezse, isteği Nginx/Apache’ye aktarır (cache miss). Backend cevabı geldikten sonra, kurallara göre önbelleğe koyabilir.

Bu rol dağılımı sayesinde Nginx/Apache & PHP-FPM & veritabanı üçlüsü, aynı anda çok daha az dinamik isteği işlemek zorunda kalır. Örneğin yoğun bir haber sitesinde anasayfa isteğinin %90’ından fazlasını Varnish üzerinden cevaplayabildiğinizde, CPU yükünün dramatik biçimde düştüğünü, NVMe disk I/O’sunun rahatladığını ve tepki sürelerinin istikrarlı hale geldiğini görebilirsiniz. Yüksek trafikli haber ve blog siteleri için hosting ve önbellek stratejileri üzerine yazdığımız rehberde bu etkiyi detaylı örneklerle anlatıyoruz.

HTTP/HTTPS konusu: TLS nerede bitmeli?

Varnish tarihsel olarak TLS (HTTPS) terminasyonunu doğrudan desteklemediği için genellikle aşağıdaki iki desen kullanılır:

  • Desen 1: TLS terminatörü (ör. Hitch veya Nginx) → Varnish (HTTP) → Nginx/Apache (HTTP)
  • Desen 2: Dış tarafta başka bir load balancer/CDN TLS’i bitirir → Varnish’e HTTP olarak gelir → Backend’e HTTP gider

Bu yazıda odak noktamız, Varnish’in Nginx/Apache önünde olduğu klasik reverse proxy senaryosu; dolayısıyla örneklerde HTTP üzerinden konuşacağız. Üretim ortamında ise genellikle Nginx veya Hitch ile TLS terminasyonu yapıp trafik Varnish’e HTTP olarak aktarılır. Detaylı TLS ve HTTP/2/HTTP/3 optimizasyonları için HTTP/2 ve HTTP/3 desteğinin SEO ve Core Web Vitals etkilerini anlattığımız rehbere de mutlaka göz atın.

Mimari Tasarım: Tek VPS, Çoklu VPS ve DCHost Üzerinde Gerçekçi Senaryolar

Varnish’i nereye koyacağınız tamamen iş yükünüzün büyüklüğüne ve mevcut altyapınıza bağlı. DCHost tarafında en sık gördüğümüz üç temel senaryoyu özetleyelim.

1) Tek VPS Üzerinde Hepsi Bir Arada (Küçük/Orta Ölçek)

Başlangıç düzeyinde veya orta trafik alan siteler için en pratik mimari:

  • Tek bir NVMe VPS üzerinde: Varnish + Nginx veya Apache + PHP-FPM + veritabanı
  • Varnish 80. portu dinler, backend Nginx/Apache 8080 gibi iç bir porttan yayın yapar.

Örnek trafik profili:

  • Aylık 300k – 5M sayfa görüntüleme
  • Ağırlıklı okuma trafiği (blog, içerik sitesi, basit e-ticaret)
  • Yoğun anlarda saniyede 100–300 istek

Bu senaryoda bile doğru Varnish konfigürasyonu ile, örneğin yüksek TTFB sorunlarının sunucu tarafı nedenlerini büyük oranda ortadan kaldırabilirsiniz.

2) Ayrı Varnish Katmanı + Ayrı Uygulama Sunucuları (Orta/Büyük Ölçek)

Daha yüksek trafikli yapılarda, özellikle WooCommerce, büyük kataloglu mağazalar ve SaaS panellerinde aşağıdaki mimariyi tercih ediyoruz:

  • 1 veya daha fazla Varnish sunucusu (VPS veya dedicated)
  • Arkada 1–N adet Nginx/Apache + PHP-FPM uygulama sunucusu
  • Veritabanı ayrı bir VPS veya dedicated sunucuda

Bu mimaride Varnish aynı zamanda basit bir HTTP load balancer olarak da davranabilir. Backend havuzuna birden fazla Nginx/Apache sunucusu ekleyip, trafiği round-robin veya health-check destekli şekilde dağıtabilirsiniz. Eğer bu yapıyı daha da ileri taşımak isterseniz, Nginx reverse proxy ve basit load balancer kurulum rehberimizde anlattığımız bazı fikirleri Varnish ile birlikte uygulayabilirsiniz.

3) Varnish + CDN + Edge Önbellekleme (Global Trafik)

Global hedef kitleye hizmet veren projelerde, Varnish’i yalnızca uygulama sunucusunu koruyan bir katman olarak değil, aynı zamanda CDN ile birlikte çalışan bir origin cache ve shield olarak konumlandırıyoruz:

  • Kullanıcı → CDN (edge cache) → Varnish (origin cache) → Nginx/Apache backend

Burada CDN, dünya genelinde gecikme sürelerini düşürürken, Varnish hem CDN isteklerini hem de doğrudan gelen HTTP trafiğini karşılayabilir. CDN önbellek kurallarıyla Varnish kurallarını uyumlu tasarlamak için CDN önbellekleme ve Cache-Control başlıkları rehberimizdeki önerilerden yararlanabilirsiniz.

Adım Adım Kurulum: Varnish + Nginx Reverse Proxy Örneği

Örnek senaryoda Ubuntu/Debian tabanlı bir VPS üzerinde, Nginx backend ve önünde Varnish kullanacağız. Apache kullananlar için mantık aynı, sadece backend konfigürasyon dosyaları farklı dizinlerde olacak.

1) Nginx’i İç Porttan Yayın Yapacak Şekilde Ayarlama

Varsayılan kurulumda Nginx 80. portu dinler. Varnish’in bu portu devralabilmesi için Nginx’i 8080 gibi dahili bir porta taşıyoruz.

Örnek Nginx server bloğu:

server {
    listen 8080;
    server_name example.com www.example.com;

    root /var/www/example.com/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ .php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Burada önemli olan nokta, listen 80; yerine listen 8080; kullanmamız. Aynı zamanda siteniz birden çok vhost içeriyorsa, hepsini 8080’e taşımanız gerekecek.

2) Varnish Kurulumu ve Backend Tanımı

Debian/Ubuntu üzerinde temel Varnish kurulumu:

apt update
apt install varnish

Ardından, backend olarak Nginx’i tanımlamak için genellikle /etc/varnish/default.vcl dosyasını düzenleriz.

Basit backend tanımı:

vcl 4.1;

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_recv {
    # Sağlık kontrolü veya basit bypass kuralları için temel örnekler

    # Yönetim panelini cache'leme (çoğu zaman) istemeyiz
    if (req.url ~ "wp-admin" || req.url ~ "wp-login.php") {
        return (pass);
    }
}

sub vcl_backend_response {
    # Backend cevabını cache'lerken temel TTL ayarları
    if (bereq.url ~ ".(png|jpg|css|js|gif|svg)$") {
        set beresp.ttl = 1h;
    } else {
        set beresp.ttl = 120s;
    }
}

Bu aşamada yaptığımız şey çok basit: Varnish’e “tüm istekleri 127.0.0.1:8080’deki Nginx’e ilet, ama admin ve login sayfalarını cache’leme” demek. Burayı, uygulamanıza özel kurallarla zenginleştireceğiz.

3) Varnish’in 80. Portu Dinlemesini Sağlamak

Varnish varsayılan olarak 6081 portunu dinler. Bunu 80 olarak değiştirmemiz gerekiyor. Sistemd tabanlı dağıtımlarda bu ayar genellikle /lib/systemd/system/varnish.service veya /etc/systemd/system/varnish.service altında yer alır.

Örnek servis parametreleri:

ExecStart=/usr/sbin/varnishd 
  -a :80 
  -T 127.0.0.1:6082 
  -f /etc/varnish/default.vcl 
  -s malloc,2G

Burada dikkat edilmesi gereken noktalar:

  • -a :80 → Varnish’in 80. portu dinlemesini sağlar.
  • -T → Yönetim arayüzü (varnishadm) için kullanılacak kontrol portu.
  • -s malloc,2G → RAM üzerinde 2GB cache alanı ayır.

Servis dosyasını düzenledikten sonra:

systemctl daemon-reload
systemctl restart varnish

Artık tarayıcıdan http://example.com isteği geldiğinde ilk temas eden bileşen Varnish olacaktır.

WordPress/WooCommerce için Varnish VCL İpuçları

Varnish’in gerçek gücü, VCL ile isteklere ve header’lara göre ince ayar yapabilmemizden geliyor. WordPress ve WooCommerce gibi PHP uygulamalarında, özellikle çerez yönetimi ve giriş yapmış kullanıcılar açısından doğru kurgu kritik.

Oturum açmış kullanıcıları Cache Dışında Bırakmak

Genellikle şu prensibi uygularız:

  • Ziyaretçi giriş yapmamışsa → sayfanın HTML çıktısını güvenle cache’le.
  • Ziyaretçi giriş yapmışsa → kişiye özel içerik olabilir, bu yüzden pass (cache’siz) çalış.

WordPress tarafında giriş yapmış kullanıcıları tespit etmek için genellikle wordpress_logged_in_ çerezi kullanırız.

sub vcl_recv {
    # ... backend tanımı aynı kalsın ...

    # Yönetim alanı ve login sayfası
    if (req.url ~ "wp-admin" || req.url ~ "wp-login.php") {
        return (pass);
    }

    # Giriş yapmış kullanıcıların çerezleri
    if (req.http.Cookie ~ "wordpress_logged_in_") {
        return (pass);
    }

    # Gereksiz çerezleri temizleyerek cache hit oranını arttır
    if (req.http.Cookie) {
        # Analytics, A/B test veya tamamen önemsiz çerezleri silebilirsiniz
        set req.http.Cookie = regsuball(req.http.Cookie, "(_ga|_gid|_fbp)=[^;]+(; )?", "");
        if (req.http.Cookie == "" || req.http.Cookie == ";") {
            unset req.http.Cookie;
        }
    }
}

Bu sayede anonim ziyaretçilerin gördüğü sayfalar agresif şekilde cache’lenirken, giriş yapmış yönetici veya üye kullanıcılar için uygulama her isteği dinamik olarak hesaplayacaktır.

WooCommerce Sepet, Ödeme ve Hesap Sayfaları

WooCommerce sitelerinde en sık yapılan hata, sepet ve ödeme adımlarını da Varnish ile cache’lemeye çalışmaktır. Bu, kullanıcıların birbirinin sepetini görmesi gibi çok ciddi problemler doğurabilir. Dolayısıyla aşağıdaki URL desenlerini mutlaka bypass etmek gerekir:

  • /cart/
  • /checkout/
  • /my-account/ (duruma göre)

Örnek VCL kuralı:

sub vcl_recv {
    # ... önceki kurallar ...

    if (req.url ~ "/cart" || req.url ~ "/checkout" || req.url ~ "/my-account") {
        return (pass);
    }
}

WooCommerce tarafında veritabanı performansı ve indeksleme de en az önbellekleme kadar kritik. Bu konuda daha derin optimizasyon yapmak isterseniz, WooCommerce için MySQL/InnoDB tuning kontrol listesini anlattığımız rehbere göz atmanızı öneririz.

Cache-Control Header’ları ile Uyumlu Çalışmak

Modern uygulamalarda HTTP cache yönetimini sadece Varnish tarafında değil, aynı zamanda uygulamanın ürettiği Cache-Control başlıklarıyla birlikte düşünmek gerekir. Örneğin:

Cache-Control: public, max-age=120, stale-while-revalidate=30, stale-if-error=86400

Bu başlık, Varnish (ve varsa CDN) tarafına şu mesajı verir: “Bu cevabı 120 saniye boyunca taze kabul et, 30 saniye boyunca arkada yenilerken eskiyi sunabilirsin, hata durumunda ise 1 gün boyunca eski cevabı kullan.” Detaylarını stale-while-revalidate ve stale-if-error mekanizmalarını anlattığımız yazıda daha derin ele aldık.

Performans Kazançları: TTFB, RPS ve Kaynak Kullanımı

Kurumsal projelerde Varnish katmanı eklediğimizde tipik olarak gördüğümüz ölçülebilir kazanımlar şöyle:

1) TTFB (Time To First Byte) İyileşmesi

PHP tabanlı bir WordPress sayfasının dinamik işlendiği senaryoda TTFB değerleri çoğu zaman 300–800ms aralığında seyreder (uygulamaya, veritabanına ve network’e göre). Varnish ile cache hit oranı yüksek olduğunda:

  • TTFB değerleri 20–60ms bandına kadar inebilir.
  • CDN ile birlikte kullanıldığında, ziyaretçinin lokasyonuna göre 10–40ms seviyeleri bile görülebilir.

Bu düşüş, Core Web Vitals metriklerinde özellikle TTFB ve LCP (Largest Contentful Paint) tarafında doğrudan puan kazandırır. Sunucu tarafı metriklerin SEO ve kullanıcı deneyimine etkisini detaylıca anlattığımız Core Web Vitals ve hosting altyapısı rehberini de bununla birlikte okumanız faydalı olur.

2) RPS (Request Per Second) Kapasitesinin Artması

Varsayımsal bir örnek üzerinden gidelim:

  • Öncesinde: Tek bir NVMe VPS üzerinde Nginx + PHP-FPM ile saniyede 150–200 istek civarında CPU %80–90’lara vuruyor, tepki süreleri uzamaya başlıyor.
  • Varnish sonrası: Aynı VPS üzerinde, %80+ cache hit oranıyla saniyede 800–1500 isteğe kadar ölçeklenebildiğinizi görüyorsunuz; çünkü PHP-FPM’e ulaşan istek sayısı dramatik biçimde azalmış durumda.

Bu fark, özellikle kampanya dönemlerinde trafik patlamaları yaşayan e-ticaret sitelerinde ve haber portallarında adeta sigorta işlevi görüyor. Yük testlerini planlarken, Varnish öncesi ve sonrası kapasite farkını ölçmek için k6, JMeter ve Locust ile load test rehberimizde anlattığımız senaryolardan yararlanabilirsiniz.

3) CPU, I/O ve Veritabanı Yükünün Azalması

Varnish’in asıl güzelliği, uygulama koduna dokunmadan “yukarıdan” katman ekleyerek altyapıyı rahatlatmasıdır:

  • PHP-FPM işlem havuzları çok daha az yoğun olur, pm.max_children limitlerine dayanma ihtimali azalır.
  • Veritabanına giden sorgu sayısı ciddi biçimde düşer, InnoDB buffer pool daha verimli kullanılır.
  • Disk I/O, özellikle log yazma ve geçici dosya oluşturma tarafında hafifler.

Biz DCHost olarak genellikle Varnish kurulumu yaptığımız projelerde, eş zamanlı olarak PHP-FPM havuz ayarlarını ve veritabanı konfigürasyonlarını da elden geçiriyoruz. Böylece önbellek katmanından gelen kazanımlar, uygulama katmanında da boşa gitmemiş oluyor.

Gelişmiş Konular: Mikro Önbellekleme, PURGE ve İzleme

Temel kurulumdan sonra Varnish’i gerçekten üretim-hazır hale getirmek için birkaç gelişmiş konuyu da hesaba katmak gerekir.

Mikro Önbellekleme (Microcaching)

Bazı projelerde tam sayfa cache kullanmak yerine veya yanında, 1–5 saniyelik mikro önbellekleme çok iyi sonuçlar verir. Özellikle “yarı dinamik” sayfalarda (listeler, arama sonuçları, yoğun API istekleri) backend’i gevşetmek için birebirdir.

Bu fikir Nginx FastCGI cache tarafında da yıllardır uygulanıyor; detaylarını Nginx mikro önbellekleme rehberimizde anlattık. Aynı prensibi Varnish üzerinde de kullanabilirsiniz:

sub vcl_backend_response {
    if (beresp.ttl <= 0s || beresp.status >= 500) {
        # Hata cevabını kısa süreliğine sakla, stale-if-error senaryoları için
        set beresp.ttl = 10s;
    } else {
        # Normal sayfalar için mikro cache
        set beresp.ttl = 5s;
    }
}

Bu yaklaşım, hızlı değişen ama her istekte birebir güncel olmasına gerek olmayan API çıktıları veya liste sayfalarında oldukça etkilidir.

PURGE / BAN: Önbelleği Uygulamadan Temizlemek

Varnish kullandığınızda, içerik güncellendiğinde (örneğin WordPress’te yazı kaydedildiğinde) ilgili sayfaların önbelleğini temizlemek için bir mekanizma kurmanız gerekir. İki yaygın yöntem:

  • PURGE: Belirli bir URL için cache’i tamamen siler.
  • BAN: Belirli bir pattern’e uyan objeleri geçersiz işaretler, yeni istekler geldiğinde yenileriyle değiştirir.

Örnek PURGE tanımı:

acl purge {
    "127.0.0.1";
    "::1";
}

sub vcl_recv {
    if (req.method == "PURGE") {
        if (!client.ip ~ purge) {
            return (synth(405, "Not allowed."));
        }
        return (purge);
    }
}

Böylece uygulamanızdan veya yönetim scriptlerinden, örneğin curl -X PURGE http://example.com/yazim komutuyla ilgili sayfanın önbelleğini temizleyebilirsiniz. WordPress tarafında bu işlemi Varnish entegrasyon eklentileriyle otomatik hale getirmek de mümkün.

Varnish Loglama ve İzleme

Performansını gözünüzle görmek için Varnish’in sunduğu araçlar oldukça faydalıdır:

  • varnishstat → Cache hit/miss oranları, backend isteği sayıları, bellek kullanımı vb.
  • varnishlog → Belirli bir isteğin baştan sona nasıl işlendiğini detaylı gösterir.
  • varnishhist → Hit/miss dağılımını histogram olarak sunar.

Biz DCHost’ta yüksek trafikli projelerde Varnish metriklerini genellikle Prometheus + Grafana ile topluyor, alarmlar kuruyoruz. Bu sayede cache hit oranı beklenmedik şekilde düştüğünde (yanlış deploy, kötü yapılandırma, uygulama güncellemesi vb.) hızlıca müdahale etmek mümkün oluyor.

Varnish mi, Nginx FastCGI Cache mi, CDN mi? Doğru Kombinasyon

Önbellekleme dünyasında sadece Varnish yok; Nginx FastCGI cache, LiteSpeed Cache, Redis/Memcached object cache ve CDN edge cache gibi katmanlar da devrede. DCHost tarafında sık kullandığımız pratik kombinasyonlar şöyle:

  • Basit yapı: Nginx FastCGI cache + tarayıcı/CDN cache başlıkları
  • Orta seviye: Varnish tam sayfa cache + Redis object cache + CDN
  • İleri seviye: Varnish origin cache + global CDN edge cache + veritabanı replikasyonu

Varnish, özellikle çoklu backend, gelişmiş VCL kuralları ve yüksek trafik altında ölçeklenebilirlik arayan projelerde oyun değiştirici bir rol üstleniyor. Ancak küçük bir WooCommerce mağazası için Nginx FastCGI cache de gayet yeterli olabilir; bu tarz kararları verirken WordPress’te tam sayfa önbellekleme çözümlerini karşılaştırdığımız yazıya da göz atmanızı öneririm.

DCHost Altyapısında Varnish Kullanırken Dikkat Ettiğimiz Noktalar

DCHost olarak, Varnish’i özellikle şu ortamlarda sıkça konumlandırıyoruz:

  • NVMe VPS’ler üzerinde yüksek trafikli WordPress/Laravel projeleri
  • Dedicated sunucularda büyük kataloglu WooCommerce, Magento mağazaları
  • Colocation altyapısında kendi donanımını barındıran müşterilerin önüne gelen reverse proxy katmanı

Uygulamada dikkat ettiğimiz temel prensipler:

  • Önce uygulamanın mantığını ve dinamik bölgelerini anlamak, sonra cache kurallarını yazmak
  • Her zaman önce staging ortamında denemek, load test ile kapasiteyi ölçmek
  • Varnish + PHP-FPM + veritabanı üçlüsünü birlikte optimize etmek
  • Cache hit oranını ve backend yükünü sürekli izlemek, beklenmedik düşüşlere karşı alarmlar koymak

Özet ve Sonraki Adımlar: Varnish ile Trafik Patlamalarına Karşı Hazırlıklı Olun

Varnish Cache, Nginx veya Apache’nin önüne konumlandırıldığında, özellikle PHP tabanlı dinamik sitelerde en yüksek yatırım getirisine sahip optimizasyon katmanlarından biri haline geliyor. Doğru VCL kurallarıyla giriş yapmış kullanıcıları, sepet ve ödeme adımlarını, kişiselleştirilmiş sayfaları cache dışı bırakırken; geri kalan geniş ziyaretçi kitlesi için HTML çıktısını RAM üzerinde tutup milisaniyeler içinde sunabiliyorsunuz. Sonuç olarak:

  • TTFB ve genel sayfa yüklenme süreleri ciddi oranda kısalıyor, Core Web Vitals skorlarınız iyileşiyor.
  • Aynı donanım ile çok daha yüksek RPS değerlerine ulaşıp trafik patlamalarına dayanıklı hale geliyorsunuz.
  • PHP-FPM ve veritabanı katmanındaki baskı azaldığı için, hem hata oranları hem de “ani yavaşlama” şikayetleri belirgin şekilde düşüyor.

Eğer hâlihazırda Nginx/Apache + PHP-FPM ile çalışan bir siteniz varsa ve özellikle yoğun saatlerde CPU, I/O veya veritabanı darboğazı yaşıyorsanız, sonraki adımınız çok net olabilir: önce iyi bir kapasite analizi ve ardından Varnish tabanlı reverse proxy katmanı eklemek. Biz DCHost tarafında, ihtiyaca göre tek bir NVMe VPS üzerinde kompakt bir Varnish mimarisi kurmaktan, birden fazla dedicated sunucu ve colocation altyapısını kapsayan çok katmanlı yapılandırmalara kadar farklı senaryolarda müşterilerimize destek veriyoruz.

Varnish kurulumuna başlamadan önce, projenizin gereksinimlerini ve büyüme hedeflerini netleştirmek isterseniz, mevcut makalelerimizden de yararlanabilirsiniz: load test için kapasite analizi, Core Web Vitals için sunucu tarafı optimizasyon ve tam sayfa önbellekleme yazıları bu yolculukta sağlam bir temel oluşturacaktır. Sonrasında, DCHost üzerinde kullanacağınız NVMe VPS, dedicated sunucu veya colocation altyapısına, Varnish ile güçlendirilmiş bir reverse proxy katmanı ekleyerek sitenizi hem hızlı hem de ölçeklenebilir hale getirebilirsiniz.

Sıkça Sorulan Sorular

Varnish Cache hem Nginx hem de Apache ile rahatlıkla kullanılabilir. Varnish için önemli olan, arkadaki web sunucusunun HTTP üzerinden ulaşılabilir olmasıdır; bu sunucu Nginx, Apache, hatta başka bir reverse proxy veya uygulama sunucusu olabilir. En sık kullanılan desen, Varnish’i 80. portta dinleyen katman olarak konumlandırmak ve backend olarak Nginx veya Apache’yi 8080 gibi farklı bir iç porta taşımaktır. Apache kullanıyorsanız, NameVirtualHost ve VirtualHost tanımlarını bu yeni porta göre güncellemeniz yeterli olur. Önemli olan, Varnish’in backend olarak doğru host/port kombinasyonuna işaret etmesi ve uygulamaya özgü cache kurallarının (admin alanı, giriş yapan kullanıcılar vb.) VCL içinde doğru yazılmasıdır.

WordPress ve WooCommerce’te tam sayfa önbellekleme yaparken temel prensip, anonim ziyaretçilerin gördüğü sayfaları agresif bir şekilde cache’lemek, ancak kullanıcıya özel içerikleri (giriş yapmış kullanıcılar, sepet, ödeme, hesap sayfaları) daima dinamik bırakmaktır. Bunu Varnish VCL içinde, özellikle çerez ve URL bazlı kurallarla sağlarız. Örneğin, wordpress_logged_in_ çerezini taşıyan istekleri ve wp-admin/wp-login.php yollarını pass ile arkadaki PHP’ye yönlendiririz. WooCommerce için /cart, /checkout ve /my-account gibi kritik adımları da cache dışı bırakmak şarttır. İçerik güncellendiğinde önbelleği otomatik temizlemek için ise PURGE veya BAN tabanlı entegrasyon, WordPress tarafında bir eklenti veya ufak bir webhook scriptiyle kolayca kurulabilir.

Evet, doğru tasarlandığında Varnish, Nginx FastCGI cache ve CDN önbelleği birbirini tamamlayabilir. Ancak her katmanın rolünü net tanımlamak gerekir. Örneğin tipik bir senaryoda CDN, statik dosyalar ve HTML için edge-level önbellek sağlayarak global gecikmeyi azaltır; Varnish ise origin tarafında tam sayfa önbellek ve çoklu backend yönetimi yapar; Nginx FastCGI cache ise ya devre dışı bırakılır ya da sadece belirli kritik yollar için mikro önbellek olarak kullanılır. Önemli olan, Cache-Control ve varyant kurallarının birbiriyle çakışmaması ve beklenmedik cache bypass durumlarının izlenebilmesidir. Çoğu projede Varnish + CDN kombinasyonu, tek başına Nginx FastCGI cache’e göre daha esnek ve ölçeklenebilir bir yapı sunar.

Öncelikle Varnish öncesi ve sonrası için karşılaştırılabilir test koşulları oluşturmak önemlidir. Aynı VPS veya sunucu üzerinde, aynı PHP-FPM ve veritabanı ayarlarıyla, önce Varnish kapalıyken GTmetrix, PageSpeed Insights veya WebPageTest gibi araçlarla TTFB ve genel yüklenme sürelerini ölçebilirsiniz. Ardından Varnish’i devreye alıp, cache ısındıktan sonra (yani popüler sayfalar birkaç kez ziyaret edildikten sonra) aynı testleri tekrarlayın. Buna ek olarak, k6 veya JMeter gibi load test araçlarıyla saniyede istek (RPS) kapasitesini ölçmek çok değerli veriler sunar. Sunucu tarafında ise varnishstat, htop ve veritabanı istatistiklerini izleyerek CPU, bellek ve I/O yükünün nasıl değiştiğini net şekilde görebilirsiniz.

Varnish için ayıracağınız RAM miktarı, sitenizin trafik profiline ve sayfa çeşitliliğine bağlıdır. Genel pratik, toplam sunucu RAM’inin tamamını Varnish’e vermemek, PHP-FPM, veritabanı ve işletim sistemi için de yeterli pay bırakmaktır. Örneğin 8 GB RAM’li bir NVMe VPS’te, 2–3 GB’ı Varnish’e, geri kalanını PHP-FPM ve veritabanına ayırmak çoğu orta ölçekli WordPress/WooCommerce sitesi için dengeli bir yaklaşım olur. Cache boyutunu belirlerken, tipik olarak en çok görüntülenen sayfaların toplam HTML boyutunu ve çeşitliliğini kabaca tahmin edip, bunların birkaç katı kadar alan bırakmak güvenlidir. Zaman içinde varnishstat ve sistem izleme araçlarıyla doluluk oranını takip edip gerektiğinde ayarları revize edebilirsiniz.