Varnish Akış Şeması

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

oguzhaninan
Devops Türkiye☁️ 🐧 🐳 ☸️
4 min readSep 28, 2019

--

Yazının kapağında gördüğünüz rşema Varnish’in Akış Şeması. Akışı iki parçaya ayırabiliriz:

  1. Arka uç alımları (gri kutu)
  2. İstek ve yanıt işleme (akış şemasının geri kalanı)

Şimdi alt rutinlerin anlam kazanmaya başladığı bir yere geldik. Özetlemek için, akış şemasının önemli noktalarından bazılarını inceleyelim:‌

  • Her oturum vcl_recv ile başlar.
  • Önbellek aramaları vcl_hash içinde gerçekleşir.
  • Önbelleğe alınamayan istekler vcl_pass içinde doğrudan arka uca iletilir. Yanıtlar önbelleğe alınmaz.
  • Önbellekte bulunan öğeler vcl_hit tarafından işlenir.
  • Bulunmayan nesneler vcl_miss yordamı tarafından ele alınmaktadır.
  • Nesne yoksa veya pass edilmişse istekler vcl_backend_fetch aracılığıyla arka uçtan alınır.
  • Arka uç yanıtları vcl_backend_response tarafından gerçekleştirilir.
  • Bir arka uç getirme işlemi başarısız olduğunda, hata vcl_backend_error tarafından gerçekleştirilir.
  • Önbelleğe alınan, geçen veya kaçırılan geçerli yanıtlar vcl_deliver tarafından iletilir.

Şimdi HTTP isteklerini ve yanıtlarını değiştirmek ve akışın diğer aşamalarına geçmek için VCL söz dizimini ve VCL nesnelerini öğrenmenin zamanı geldi.

Arka Uçlar (Backends) ve Health Probes

Şimdiye kadar ele aldığımız tüm VCL, Varnish’in davranışını değiştirmemize izin veren rutinler ile ilgiliydi. Ancak, Varnish’in asıl amacı arka uç yanıtlarını önbelleğe almak olduğunu unutmayın. Bu yüzden arka uçların VCL yönünü ele almamızın zamanı geldi. Genel olarak aşağıdaki gibi gözükür.

backend name {  .attribute = "value";}

Varnish, önce tanımlanmış olan arka uca otomatik olarak bağlanır. Diğer arka uçlar sadece req.backend_hint değişkenine değer atayarak kullanılabilir.

Desteklenen arka uç nitelik listesi:

backend default {  .host = "127.0.0.1";  .port = "8080";  .connect_timeout = 2s;  .first_byte_timeout = 5s;  .between_bytes_timeout = 1s;  .max_connections = 150;}‌

Yukarıdaki örnekte, 8080 numaralı bağlantı noktasında yerel makineyle bağlantı kurulur. İlk bağlantı için en fazla iki saniye bekleyecek. Bağlantı kurulduktan sonra, ilk baytı almak için beş saniye kadar bekleyecek. Bundan sonra düzenli bir frekans ile bayt almak istiyoruz. Her bayt arasında en fazla bir saniye bekleyecek. Arka uçla aynı anda 150 bağlantıya izin verecek.

Arka uçtan daha fazla istek max_connections ayarında izin verilenden daha fazla olursa, başarısız olurlar.

Kriterlerden herhangi biri karşılanmazsa, arka uç hatası atılır ve HTTP 503 durum koduyla vcl_backend_error'a iletilir.

‌Bir arka uç probu kullanılmadan, sağlıksız bir arka uç ancak bağlantı koptuğunda tespit edilebilir. Sözde bir arka uç probu, arka uçları düzenli olarak sorgulayacak ve belirli koşullara dayanarak sağlığını kontrol edecektir. problar arka uçlara benzer şekilde tanımlanabilir.

probe name {  .attribute = "value";}

Örnek bir kod aşağıda:

backend default {  .host = "127.0.0.1";  .port = "8080";  .probe = {    .url = "/";     .expected_response = 200;    .timeout = 1s;    .interval = 1s;    .window = 5;    .threshold = 3;    .initial = 2;  }}

Yukarıdaki örnekte: arka uç 8080 numaralı bağlantı noktasındaki yerel ana bilgisayara bağlanmaya çalışır. Arka uç sağlığını belirleyen bir arka uç probu vardır. prob, kök URL’deki 8080 numaralı bağlantı noktasında arka uça yoklama yapar. Bir yoklamanın başarılı olması için 200 durum kodlu bir HTTP yanıtı bekleniyor ve bu yanıt bir saniye içinde verilmeli.

Her saniye, prob arka ucu yoklayacak ve beş yoklama sonucu sağlığı belirlemek için kullanılıyor. Bu beş yoklamadan en az üçünün, arka uç sağlıklı olduğunu düşünmesi için başarılı olması gerekir. Başlangıçta, bu iki yoklama olmalıdır.

‌Ayrıca bir probu açıkça tanımlayabilir, adlandırabilir ve bu probu çoklu arka uçlar için yeniden kullanabiliriz. İşte bunu yapan bir kod örneği:

probe myprobe {  .url = "/";  .expected_response = 200;  .timeout = 1s;  .interval = 1s;  .window = 5;  .threshold = 3;  .initial = 2;}backend default {  .host = "my.primary.backend.com";  .probe = myprobe;}backend backup {  .host = "my.backup.backend.com";  .probe = myprobe;}

Erişim Kontrol Listeleri (ACL)

Erişim kontrol listeleri veya çağırmak istediğimiz ACL’ler, VCL’de IP adresleri, IP aralıkları veya hostname içeren yapılardır. ACL’ler çoğunlukla, IP adresinize dayalı olarak içeriğinizin belirli bölümlerine erişimi kısıtlamak için kullanılır. Eşleşme işleci (~) if kullanılarak eşleştirilebilir. İşte bir kod örneği:

default.vcl

acl allowed {  "localhost";  "192.0.2.0"/24; # yerel ağdaki herkes  ! "192.0.2.23"; # bu ip hariç hepsi}sub vcl_recv {  if(client.ip !~ allowed) {    return(synth(403, "Erişim engeliniz var."));  }}

VCL Değişkenleri

--

--