H O K K A
12 Ekim 2016

(Webin Hızlı Hali ) Varnish Nedir?

Varnish yani diğer anlamıyla hızlı web,  geçmişten beri kullandığımız bir internet hızlandırıcı  dır.

Varnish aracı, verilen komutları, istekleri  sahip olduğu kurallar çerçevesinde cache’leyip istemciye dönüş sağlayan  ve , genel olarak web sunucu önünde programlandırılmaktadır.

İlk etapta istek, Varnish’e geliyor ardından ise Varnish önbelleği sayesinde istek dönüyor. Eğer ön bellek yoksa  vars “backend”den fetch etmek durumunda kalıyor.

Peki, Varnish kullanım alanları nelerdir?

Varnish, tüm kullanıcılar için aynı şekilde sunulmakta olan içeriği,  vermektedir.

Açıklamak gerekirse; tüm kullanıcılara sunulan CSS ve JavaScript dosyaları ayrıntıları birebirdir. Bu “static” dosyaları için istemci sayesinde  cache’leme yapılsa dahi  sahip olunan dosyalar için üzerinde uygulama çalışmakta olan web sunucuya inmek, eğer o sunucu meşgul ise  gereksiz olabilir.

Farklı bir örnek ile açıklamak gerekirse de kullanıcılara özel içerik sunmak yerine aynı içeriği tüm sunuculara sunabilen siteler için de geçerli bir araçtır. Siteye yüzbinlerce kişi girse de her bir kullanıcı aynı içeriği görmek durumunda kalıyor.

Ubuntu/Debian kullanıcıları

sudo apt-get install varnish

ile basitçe kurabilir. Varnish ontamınlı olarak 6081 portunu dinler. Bunun 80. portu dinlemesini isterseniz /etc/default/varnish dosyasındaki “DAEMON_OPTS” direktifini değiştirebilirsiniz.

Varnish’in öntanımlı ayar dosyası  için /etc/varnish/default.vcl adresine ulaşmanız gerekiyor. Bu adres üzerinde öntanımlı olarak 8080 portunda çalışan “backend”den veri alma amacıyla tasarlanmış bulunmaktadır.

Saip olduğunuz web sunucunuzu 8080 portu üzerinden çalıştırarak, yukarıda yer alan  DAEMON_OPTS’dan da varnish’i 80. porttan çalışmak  için ayarladığınızda  sizin sunucunuza gelen istekler önce Varnish’e uğrayacak eğer cache  sunucunuzun (backend)  bölümüne inecektir.

Varnish (hızlı web ) ayarları, VCL(Varnish Configuration Language) ile anlatılmaktadır. VLC ile, ayar dosyalarında, kullanılacak backend’ler, bu backend’lere gidecek yükü dağıtacak director’lar, gelen istekleri var olan kurallarauygun bir şekilde cache’lenecek ve, bu cache’in nasıl invalide  yapılacağını belirten kuraları dizimi mevcuttur.

Bizler bunu  vlc_recv ve vlc_fetch methodlarını düşünerek uygulayacağız.

  • # istekler, 8080. portu üzerinde çalışıyor
  • backend default {
  •     .host = “127.0.0.1”;
  •     .port = “8080”;
  • }
  • # istek baslangicinda cagirilir
  • # burada, istek manipule edilebilir,
  • # orn: istege bir header eklenebilir
  • sub vcl_recv {
  •   # AJAX istekleri cache’lenmesin,
  •   # cogu kutuphane boyle bir baslik ekler
  •   # eger bu baslik varsa, cache’leme
  •   if (req.http.X-Requested-With) {
  •     return(pass);
  •   }
  •   # geri kalan tum istekler cache’lensin
  •   return(lookup);
  • }
  • # istek, backend’den fetch edildiginde cagirilir
  • sub vcl_fetch {
  •     # 200 donuyorsa, icerik 300 saniye boyunca cache’lensin
  •     if (beresp.status == 200) {
  •         set beresp.ttl = 300s;
  •         return (deliver);
  •     }
  • }

Yapılandırmanın hemen ardından  varnish, “X-Requested-With” header’ı olmayan tüm istekleri 300s süresince cache’lemeye koyulacak.

Peki varnish,  ne kadar hız sağlıyor.

  • <?php
  • //50ms bekle
  • usleep(50000);
  • //ust tarafta 50ms suren bir islem oldugunu varsayin
  • //daha sonra ekrana bugun basilacak
  • //herkes ayni veriyi gorecek
  • echo “Bugun : “ . date(“Y-m-d”);

Normal sisteme tam olarak 5000 adet istek girdiğimizde tamamlanma süresi 3.304 saniye olarak son buluyor.  Bu da gösteriyor ki saniye başına toplam 1513 isteğe cevap  verebilme kapasitesini doğuruyor. (5k Kullanıcı 3.300 saniye de 1513 ham dataya ulaşıyor)

Aynı durumu Varnish ile denediğimizde ise;

Girdiğimiz 5000 isteğe karşın toplam dönüş süresi, 0.307 saniyeye iniyor. Varnish,  sayesinde saniyede 16309.86 isteğe cevap verebilme özelliği ortaya çıktı. Varnish ile sunucumuz hiç olmadığı kadar hızlı çalışıyor. Bu sayede 10 kattan daha hızlı bir performans alabiliyoruz. (5k Kullanıcı 0.307 saniye de  16.309.86 ham dataya ulaşıyor)