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)