Bu internet sitesinde yer alan tüm bilgiler web hosting hizmetleri konusunda @aktifbilisim personeli, müşterileri ve uğrayan Google gezginlerine yararlı olmak amacıyla hazırlanmıştır.Sunucu veya websiteniz burada anlatıldığı şekilde işlemiyor olabilir.Lütfen olası sorunlar yaşamamak için destek sistemimizden bilgi alınız.

Varnish Cache

varnish-cacheÖzellikle dinamik oluşturulan web sayfalarının sunucuda kaynak tüketmeleri bir yana siteye gelecek basit bir css isteği bile olsa herseferinde birileri sunucunuza istekler göndererek Apache kaynaklarınızı bir şekilde tüketir.

Örneğin websitesi oluşturmada tercih edilen en popüler scriptlerden WordPress çok sorgu çalıştıran bir yapıdır.Sorguları azaltmak adına WordPress’i add-on olarak hazırlanmış cache pluginleri ile kullanmak mantıklı düşünce olsa da cacheleme sadece bununla sınırlı değildir.

Gelecek istekler için sunucuda farklı cache araçları kullanarak websayfalarının önbelleğe alınmış kopyalarını sunacak dengeli bir yapı kurulabilir.Böylece websitelerinizi hızlandırabileceğiniz gibi kaynakların daha dengeli tüketilmelerini de sağlayabilirsiniz.

İşte bu işi yapan sunucu tabanlı cache araçlarından birisi de Varnish Cache olarak bilinir.

Sitenizi shared hosting gibi paylaşımlı bir barındırma ortamında host ediliyorsa Varnish Cache sanal ve dedike sunucularda ve sitelerin yapısına göre konfigure edildiğinden bu servisten yararlanamayabilirsiniz.

Basitçe Varnish Cache, sunucu taraflı programlanabilir bir cache uygulamasıdır.Yaptığı iş ise websunucusu olarak çalışan Apache’nin önüne kurularak istemcilerden gelen istekleri kendi önbelleğinde varsa yükleyen yoksa backend’den (Apache, Ngix, Litespeed vb.) döndüren bir araçtır.

Css, javascript, resim dosyaları gibi içerikler istemci taraflı cachelenebilse de bu istekler Apache sunucumuzdan dönecektir.Yine eticaret sayfaları, kullanıcı girişi / paneli olmayan sayfalar için her istemciye aynı istekleri gösterecektir.Bu sayfalara gelen isteklerin her seferinde Apache üzerinden dönmesi web sunucumuzu boş yere meşgul edecektir.

Bu servis cacheleri disk üzerinde değil bellek üzerinde tutuar.Yine loglamayı da bellek üzerinden anlık sağlar.Dolaysısıyla verinin iletilmesi disk üzerinden çalışan bir uygulamaya göre çok daha hızlıdır.

Kullanım amacımız her istemciye aynı içeriği sunduğumuz websitelerimizde sorguların backend sunucumuz yerine Varnish sistemi üzerinden dönmesini sağlayarak mevcut Apache kapasitemizin çok üzerine çıkabiliriz.

Varnish Cache 3 sürüm dökümantasyonuna bu bağlantı üzerinden ulaşabilirsiniz.

cPanel Kurulumu

cPanel Varnish Kurulumu

cpanel-change-apache-portÖncelikle default olarak 80 portta çalışan Apache’yi 8080 portuna alalım.Bu işlemi httpd.conf ile uğraşmadan WHM panelde “Tweak Settings” kısmında otomatik olarak yapabilirsiniz.Bu işlemi yaptıktan sonra siteleriniz artık 8080 portundan çalışacaktır.Yani “askinyilmaz.com.tr:8080” şeklinde siteniz çalışıyorsa işlem başarılı demektir.Siteniz çalışmıyorsa httpd.conf dosyanızı kontrol edip Apache servisini yeniden başlatın.Sunucunuzda bir firewall kullanıyorsanız 8080 portuna ayrıca izin vermeniz gerekiyor.

WHM panelde “Home » Security Center » Compiler Access” Disable ise ENABLE etmeniz gerekiyor.Varnish’in kurulması, çalışması restart ederken bu özelliğin ENABLE olması gerek.

Kuracağımız Varnish sürümüyle ilgili sistemimize ilgili repoyu yükleyelim.Ben Centos 6.x için Varnish 3 kullanıyorum.

Daha önce Varnish 4 kurduysanız sisteminizde bu sürümün repolarını kaldırmak için aşağıdaki komutu kullanabilirsiniz.

# Varnish Repolarını Kaldır
yum remove $(rpm -qa | grep varnish)

Varnish 3 repolarını ekleyelim.

# CentOS 6 için Varnish 3 Reposu
rpm --nosignature -i http://repo.varnish-cache.org/redhat/varnish-3.0/el6/noarch/varnish-release/varnish-release-3.0-1.el6.noarch.rpm

Varnish kurulumu bazı ekstra paketler gerektiriyor.Bunların doğru şekilde yüklenmesi için sistemimize EPEL repoyu yüklememiz gerekiyor.

# EPEL repolarını tanıtalım.
yum install epel-release

Bu işlemin ardından sistemimizde Varnish’e ait hangi paketlerin olduğunu kontrol edelim.

# Varnish sürüm doğrula
yum list *varnish*

Çıktınızdaki Varnish 3 sürümünü doğruladıktan sonra Varnish kurulumuna geçebiliriz.

# Varnish Kurulum
yum install varnish

Varnish servisinin sunucumuz açılırken de başlamasını sağlayalım.

# Reboot sonrası Varnish başlatılsın
chkconfig varnish on

Ayar Dosyası

Varnish Ayar Dosyası

Kurulumu tamamladığımıza göre Varnish ayar dosyasını açıp Varnish’in 80 portumuza gelen istekleri karşılaması için çalışacağı portu 80 olarak güncelleyeceğiz.Bu işlemi dosyada “VARNISH_LISTEN_PORT” girdisini aratarak karşısındaki değeri 80 yaparak kayıt ediyoruz.

# Varnish Ayar Dosyası VARNISH_LISTEN_PORT 'u 80 olarak değiştir.
nano /etc/sysconfig/varnish

Şimdi ise default.vcl ayarlarını yapalım.Varnish’e bu ayarlarla 80 portuna gelen istekleri Apache servisimize yönlendirecek ve hangi kurallarla işleneceğini belirtiyoruz.

# Varnish default.vcl düzenlemek
nano /etc/varnish/default.vcl

Dosyayı açınca default olarak geçerli/geçersiz bazı kurallar eklenmiş.Default olarak hazırlanmış backend ayarlarını düzenliyoruz.Biz Apache’de siteleri tek ip üzerinden yayınlıyorsak “.host” adresine işte o ip adresini tanımlıyoruz.Böylece Varnish gelen istekleri o ip adresinin 8080 portuna yani eski düzen Apache servisimize yönlendiriyor.

backend default {
.host = "APACHE-IP-ADRESI";
.port = "8080";
}

Optimizasyon

Default.Vlc Optimizasyonu

default.vlc ayar dosyasının yeri /etc/varnish dizinindedir.Buraya kendi ayar dosyalarınızı oluştururak default.vlc içine örnekteki gibi include edebilirsiniz.

include "client-ip.vcl";

Doğru IP Adresi

İstemcilerin Doğru IP’leri Bir istemci Varnish’e bağlanır, Varnish ise Apache servisine bağlanır.Böylece sitemize bağlantı kuran Varnish olduğu için ziyaretçilerin doğru ip adresi almak için istemci header’ını şu şekilde güncellemek gerekiyor.

# Doğru ip adresi
sub vcl_recv {
# Client IP
# FORWARD THE IP OF THE REQUEST
if (req.restarts == 0) {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For =
req.http.X-Forwarded-For + ", " + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
}
}

Ajax İstekleri Pass Geçmek

# Ajax isteklerini dahil etme - WordPress
sub vcl_recv {
if (req.http.X-Requested-With) { return(pass); }
return (lookup);
}

Gzip, Deflate

Zaten sıkıştırılan öğeleri tekrar sıkıştırmak boş yere CPU istarfı olacaktır.Aşağıdaki örneğe göre bazı dosya türlerini hariç tutarak sitenizde GZIP, DEFLATE aktif edebilirsiniz.

# Normalize Accept-Encoding header and compression
# https://www.varnish-cache.org/docs/3.0/tutorial/vary.html
if (req.http.Accept-Encoding) {
# Bu uzantilar haric tutulsun...
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
unset req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
unset req.http.Accept-Encoding;
}
}

Gzip için default.vcl dosyasına tüm domainleri kapsayacak bir parametre ekleyebilirsiniz.İstek backend’den fetch edilirse çağır gibi.
sub vcl_fetch {
# Global GZIP
if (beresp.http.content-type ~ "text") {
set beresp.do_gzip = true;
}
}

Senaryolar

Senaryo 1 : Farklı IP’lerde Farklı Domainler

Varnish 3 sürümü için üç farklı sub/domainin üç farklı backend (ip) üzerinden çalışacağı şekilde örnek ayar dosyalarına buradan ulaşabilirsiniz.

Sunucumuzda 2 farklı ip üzerinden 2 farklı domain yayınlıyorsak bu dosyayı aşağıdaki şekilde düzenleyebiliriz.

Burada 2 adet backend sunucusu oluşturup iplere göre domainleri grupluyoruz.Ben bu grupları “A” ve “B” olarak nitelendirdim, siz istediğiniz şekilde tanımlayabilirsiniz.

# Sunucu ip adreslerimize göre 2 adet backend sunucusu oluşturalım.
backend A {
.host = "IP-ADRESI";
.port = "8080";
}
backend B {
.host = "IP-ADRESI";
.port = "8080";
}

Daha sonra “vcl_recv” kısmından hangi domainin hangi backend üzerinden çalışacağını tanıtıyoruz.

# Domainlerin hangi backend üzerinden çalışacağını ayarlayalım.
sub vcl_recv {
# Backend -> GROUP - A
# Website 1 : askinyilmaz.com
if (req.http.host ~ "^(.*\.)?askinyilmaz\.com$") {
set req.backend = A;
# Client IP
include "client-ip.vcl";
# WordPress
if (req.url ~ "wp-admin|wp-login") {
return (pass);
}
return (lookup);
}
# Backend -> GROUP - B
# Website 2 : askinyilmaz.net
if (req.http.host ~ "^(.*\.)?askinyilmaz\.net$") {
set req.backend = B;
# Client IP
include "client-ip.vcl";
# WordPress
if (req.url ~ "wp-admin|wp-login") {
return (pass);
}
return (lookup);
}
}

WordPress Özel Ayarlar

WordPress sitenizde istemci ip bilgisinin doğru alınabilmesi için wp-config.php dosyasına aşağıdaki kodları ekleyebilirsiniz.

# WP-CONFIG SET HTTP_X_FORWARDED_FOR
if( isset($_SERVER['HTTP_X_FORWARDED_FOR']) ) { $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR']; }

Yorum yapın...

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir