Varnish Yapılandırma Dili (VCL) — 1

oguzhaninan
Devops Türkiye☁️ 🐧 🐳 ☸️

--

Daha önce de bahsettiğimiz gibi, Varnish ters önbellekleme proxy’sidir. Açık kaynaklı ekosistemde bile önbellekleme yapan birçok ters proxy var. Varnish’in en önemli özelliği VCL’dir. VCL’in sunduğu esneklik bu tür yazılımlarda benzeri görülmemiştir.

Bir yapılandırma dosyasında bildirmek yerine, davranışı programlama yoluyla ifade etme ve kontrol etmeye dayanır. Varnish Konfigürasyon Dili sadece C gibi değil, VCL dosyası varnishd tarafından yüklendiğinde aslında C’ye derlenir ve paylaşılan bir nesne olarak dinamik bir şekilde yüklenir.

Kancalar ve Alt Yordamlar (hook & sub)

VCL, boş bir dosyada veya ana yöntemde (void main) yazmaya başladığınız bir dil değildir; aslında sizi kısıtlar ve sadece Varnish yürütme akışının belirli yönlerine bağlanmanıza izin verir. Kancalar (Hooks), Varnish akışının belirli aşamalarını temsil eder. Varnish’in bu aşamalardaki davranışı çeşitli yerleşik alt yordamlarla ifade edilir.‌

VCL dosyanızda bir alt yordan tanımlayın, bu alt yordamdaki önbelleğe alma davranışını genişletin ve bu davranışı etkinleştirmek için bu VCL dosyasının yeniden yüklenmesini isteyin.

İstemci Tarafı Alt Yordamları (subroutine)

İstemci tarafı alt yordamlarının bir listesi:

vcl_recv Her isteğin başında yürütülür.‌

vcl_pipe Önbelleğe almadan isteği doğrudan arka uca iletir.‌

vcl_pass İsteği doğrudan arka uca iletir. Sonuç önbellekte saklanmaz.

vcl_hit Önbellek araması başarılı olduğunda çağrılır.

vcl_miss Önbellekte bir nesne bulunamadığında çağrılır.

vcl_hash İstek için bir karma değeri oluşturmak üzere vcl_recv’den sonra çağrılır. Varnish’teki nesneyi aramak için bu anahtar olarak kullanılır.‌

vcl_purge Bir nesneye bir temizleme yapıldığında ve bu nesne önbellekten başarıyla çıkarıldığında çağrılır.

vcl_deliver Çıktı istemciye iade edildiğinde bir isteğin sonunda yürütülür.

vcl_synth Müşteriye statik bir nesne döndürür.

Arka Uç Alt Yordamları

Ve burada, arka uç alt yordamlarının bir listesi:

vcl_backend_error_fetch Arka uç sunucusuna bir istek göndermeden önce çağrılır.

vcl_backend_response Arka uç sunucusundan bir yanıt alındıktan sonra çağrılır.

vcl_backend_error Bir arka uç getirme işlemi başarılı olmadığında veya en fazla sayıda deneme sayısını aştığında gerçekleştirilir.

Başlatma ve Temizleme Alt Yordamlar

Ve son olarak, VMOD’ların başlatılması ve temizlenmesi ile ilgili olarak kullanılan iki alt rutin var:

vcl_init VCL yüklendiğinde çağrılır. VMOD’ler burada başlatılabilir.

vcl_fini VCL yürütüldüğünde yani sonuna gelindiğinde çağrılır. VMOD’ler burada temizlenebilir.

Özel Alt Rutinler

Kendi alt rutinlerinizi tanımlayabilir ve VCL kodunuzda kullanabilirsiniz. Özel alt yordamlar, çoğunlukla kod çoğaltmasını azaltmak amacıyla VCL kodunu düzenlemek ve modülerleştirmek için kullanılabilir. Aşağıdaki örnek, düzenli ifadeler kullanarak cookie’deki bazı değerleri değiştiren remove_ga_cookies isimli alt yordamdan oluşur. Google Analytics izleme çerezlerinin gelen istekten kaldırılması işini yapar.

sub remove_ga_cookies {  # Remove any Google Analytics based cookies  set req.http.Cookie = regsuball(req.http.Cookie, "__utm.=[^;]+(; )?", "");  set req.http.Cookie = regsuball(req.http.Cookie, "_ga=[^;]+(; )?", "");  set req.http.Cookie = regsuball(req.http.Cookie, "_gat=[^;]+(; )?", "");  set req.http.Cookie = regsuball(req.http.Cookie, "utmctr=[^;]+(; )?", "");}

Tanımladığımız özel alt yordamı aşağıdaki şekilde gerekli yerlerde kullanabiliriz.

sub vcl_recv {  call remove_ga_cookies;}

Dönüş İfadeleri

VCL alt rutinleri farklı durumları temsil ederken, her alt rutin içindeki return ifadesi durum değişikliklerine izin verir.‌

Bir alt yordamda geçerli bir return ifadesi belirtirseniz, ilgili eylem yürütülür ve karşılık gelen duruma bir geçiş gerçekleşir. Daha önce belirtildiği gibi: bir dönüş ifadesi belirtmediğinizde, alt yordamın yürütülmesi devam edecek ve Varnish yerleşik VCL’ye geri dönecektir.

return

Operatörler

VCL, değerleri atamak, karşılaştırmak ve eşleştirmek için kullanabileceğiniz operatörlere sahiptir. Bazı operatörleri bir araya getirdiğimiz bir örnek:

sub vcl_recv {  if(req.method == "PURGE" || req.method == "BAN") {    return(purge);  }  if(req.method != "GET" && req.method != "HEAD") {    return(pass);  }  if(req.url ~ "^/products/[0-9]+/"){    set req.http.x-type = "product";  }}
  • Değişkenlere veya nesnelere değer atamak için atama operatörünü (=) kullanırız.
  • Değerleri karşılaştırmak için karşılaştırma operatörünü (==) kullanıyoruz.
  • Normal ifade eşleştirmesi yapmak için eşleme operatörünü (~) kullanıyoruz. Değer normal ifadeyle eşleşiyorsa true döndürülür; Aksi takdirde, yanlış döndürülür.
  • Negatif operatörü (!) Ters mantıksal durumu döndürür.
  • Her iki işlenen de true dönerse, (&&) operatörü true değerini döndürür; aksi takdirde, false döndürülür.

Daha ayrıntılı bilgi için resmi dökümanı inceleyebilirsiniz.

Koşullar

if ve else ifadeleri, muhtemelen ne yaptıklarını biliyorsunuzdur. Bir örnek:

sub vcl_recv {  if(req.url == "/") {    return(pass);  } elseif(req.url == "/test") {    return(synth(200, "Test"));  } else {    return(pass);  }}

Yorumlar

VCL’nin çalıştırılmayan ancak VCL’inizi tanımlamak için yorum eklemek için kullanılan bölümleridir. VCL, VCL’inize yorum eklemek için üç yol sunar:

  1. // Çift eğik çizgi kullanarak tek satırlı yorumlar
  2. # kullanarak tek satırlı yorumlar.
  3. /* ve */ ile sınırlandırılmış bir yorum bloğunda çok satırlı yorumlar.
sub vcl_recv {// Tek satır yorum# Başka bir tek satır yorum/*Birden fazla satırdanoluşan yorum bloğu*/}

Değerler

VCL’de string, integer ve boolean kullanabilirsiniz. VCL ayrıca zaman (time) ve süreleri (duration) de destekler. Bu değerlerle ne yapabileceğimizi görelim.

String

sub vcl_recv {  set req.http.x-test = "test 123";  set req.http.x-test-uzun = {"test '123', falan "123" filan"};  set req.http.x-test-uzun-coklu-satir = {"test '123',falan "123" filan"};}

Integer

sub vcl_recv {   return(synth(200, "OK"));}

Boolean

sub vcl_backend_response {  if(beresp.http.set-cookie) {    set beresp.uncacheable = true;  }}

Durations

VCL’nin desteklediği bir diğer tür ise sürelerdir. Bunlar, zaman aşımı, yaş, grace, keep vb. İçin kullanılır. Integer bir değerin sonuna bazı son ekler getirilir. Son ek, aşağıdaki değerlerden herhangi biri olabilir:

  • ms: milisaniye
  • s: saniye
  • m: dakika
  • h: saat
  • d: gün
  • w: hafta
  • y: yıl
sub vcl_backend_response {  set beresp.ttl = 1h;}

Duration değeri float bir değerde olabilir.

sub vcl_backend_response {  set beresp.ttl = 1.5h;}

Düzenli İfadeler

VCL, Perl Compatible Regular Expressions (PCRE) destekler. ~ operatörü kullanılarak desen eşleştirmesi için normal ifadeler kullanılabilir. Regular Expressions ile, metin eşleştirme ve değiştirme için regsub ve regsuball gibi işlevlerde de kullanılabilir. Örnek:

sub vcl_recv {  if(req.url ~ "^/products/[0-9]+/"){    set req.http.x-type = "product";  }}

Include

VCL dosyasının yönetimini kolay yapabilmek için birden fazla dosyaya bölebilirsiniz. Gerektiği yerde include ifadesini kullanarak ana VCL dosyanıza dahil edebilirsiniz.

ornek-dosya.vcl

if ((req.method != "GET" && req.method != "HEAD") ||   req.http.Authorization || req.http.Cookie) {   return (pass);}

default.vcl

sub vcl_recv {include "ornek-dosya.vcl";}

Varnish Modüllerini Dahil Etme

import ifadesi, Varnish modüllerini (VMOD) yüklemenizi sağlar. Bu modüller C dilinde yazılmıştır ve Varnish’in yeteneklerini arttırır ve VCL içeriğini zenginleştirir. Varnish, import ederek etkinleştirebileceğiniz birkaç VMOD ile birlikte gelir. std VMOD’unu içe aktardığımız bir örnek:

default.vcl

import std;  sub vcl_recv {  set req.url = std.querysort(req.url);}

std modülü ile ilgili ayrıntılı bilgi için resmi dökümana göz atın.

--

--