İçindekiler:
- Verniklere Giriş
- Temel Bilgiler: Görüntüleri Önbellek
- Standart: Önbellek Görüntüleri ve Sayfaları
- Standart ++: Sunucu Esnekliğini Artırın
- Gelişmiş Kullanım: Dağıtılmış Bir Ortamda Dayanıklı Bir Web Sunucusu Oluşturma
- Güçlü Bir Araç
Web sitesi performansı söz konusu olduğunda, Vernik sıcak bir teknolojidir. Basit bir kurulum ve yapılandırma ile, herhangi bir web sitesinin performansını artırmak ve sadece küçük bir sanal özel sunucu ile bir milyon sayfaya kadar hizmet vermek mümkündür., İster yüzlerce, ister binlerce veya milyonlarca sayfa sunun, sitenizin yanıt süresini iyileştirmenize yardımcı olacak dört olası yapılandırmayı göstereceğim.
Verniklere Giriş
Varnish-Cache, web sitesi içeriğini önbelleğe almak amacıyla bir Web hızlandırıcısıdır. Bu, kodu değiştirmeden web sitelerine erişimi invaziv olmayan bir şekilde optimize etmeyi ve hızlandırmayı amaçlayan ve ellerinizi web sitenize koymanıza izin veren açık kaynaklı bir projedir.
Varnish Cache'i yaratıcıları Web hızlandırıcı olarak adlandırdılar, çünkü asıl amacı bir web sitesinin ön ucunu iyileştirmek ve hızlandırmaktır. Vernik, Web sunucusu tarafından sunulan sayfaların kopyalarını önbelleğinde saklayarak bunu başarır. Aynı sayfa bir sonraki talep edildiğinde, Vernik sayfayı Web sunucusundan istemek yerine kopyayı sunacak ve bu da büyük bir performans artışı sağlayacaktır.
Vernik Önbellek, performansına ek olarak diğer bir önemli özellik de, yapılandırma dili VCL'nin esnekliğidir. VCL, gelen isteklerin nasıl ele alınacağına ilişkin politikalar yazmayı mümkün kılar. Böyle bir politikada, hangi içeriği sunmak istediğinize, içeriği nereden almak istediğinize ve isteğin veya yanıtın nasıl değiştirilmesi gerektiğine karar verebilirsiniz.
Aşağıdaki yapılandırma örneklerinde, görüntülerin ve statik nesnelerin basit bir şekilde önbelleğe alınmasından dağıtılmış bir ortamda Vernik kullanmaya veya bir yük dengeleyici olarak işlev görmesine kadar bazı hedeflere ulaşmak için hangi VCL kurallarının kullanılacağını göstereceğim.
Aşağıdaki tüm örnekler Varnish 3.x içindir. Varnish 2.x'in farklı sözdizimi ve kurallar kullandığını lütfen unutmayın, bu nedenle bu örnekler bu sürümle uyumlu değildir.
VCL yapılandırma dosyasında kullanacağımız Varnish'in ana durumları şunlardır:
recv
Bu, istek alırken çağrılan ilk işlevdir. Burada, önbellekte olup olmadığını kontrol etmeden önce isteği değiştirebiliriz. Bir istek önbelleğe konamazsa, isteğin gönderileceği arka uç sunucu da bu aşamada seçilebilir.
geçmek
İsteği Web sunucusuna geçirmek ve yanıtı önbelleğe almak istediğimizde bu işlevi kullanabiliriz.
boru
Bu işlev Verniği atlar ve isteği Web sunucusuna gönderir.
yukarı Bak
Bir arama ile Varnish, yanıtın önbellekte mevcut ve geçerli olup olmadığını doğrulamayı ister.
getirmek
Bu işlev, içeriğin arka uçtan kurtarılması bir geçiş veya bir özledim tarafından çağrıldıktan sonra çağrılır.
Temel Bilgiler: Görüntüleri Önbellek
Şimdi bir yapılandırma örneğine bakalım. Bu ilk örnekte, görüntüleri ve CSS dosyaları gibi statik dosyaları önbelleğe alacağız. Bu yapılandırma, artırmak istediğiniz web sitesini bilmediğinizde gerçekten yararlıdır, böylece tüm görüntülerin, CSS ve JavaScript'in tüm kullanıcılar için aynı olduğuna karar verebilirsiniz. Kullanıcıları ayırt etmek için, HTTP protokolü çerezleri kullanır, bu nedenle bu tür istekte onları yok etmeliyiz, böylece Vernikler için hepsi aynıdır:
sub vcl_recv{
if(req.url ~ " * \.(png|gif|jpg|swf|css|js)"{
unset req.http.cookie;
unset req.http.Vary;
return(lookup);
}
# strip the cookie before the image is inserted into cache.
sub vcl_fetch {
if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
unset beresp.http.set-cookie;
}
Ve bu kadar. Bu VCL dosyası ile statik içeriği kolayca önbelleğe alabilirsiniz.
Standart: Önbellek Görüntüleri ve Sayfaları
Genellikle, yalnızca web sitenizin statik içeriğini önbelleğe almak istemezsiniz, aynı zamanda Web sunucunuz tarafından oluşturulan bazı dinamik sayfaları da önbelleğe almak istersiniz, ancak tüm kullanıcılar için aynıdır - ya da en azından tüm anonimleriniz için kullanıcılar. Bu aşamada, hangi sayfaların önbelleğe alınabileceğini ve hangilerinin önlenemeyeceğini seçmelisiniz.
En iyi kullanılan içerik yönetim sistemlerinden biri olan Wordpress buna iyi bir örnektir. Wordpress, PHP ile dinamik olarak web sitesi sayfaları oluşturur ve bir MySQL veritabanını sorgular. Bu güzel, çünkü web sitenizi yönetim arayüzünden birkaç tıklamayla kolayca güncelleyebilirsiniz, ancak kullanılan kaynaklar açısından da pahalıdır. Bir kullanıcı ana sayfaya her geldiğinde neden aynı PHP komut dosyasını ve MySQL sorgusunu çalıştırın? En çok ziyaret edilen sayfaları önbelleğe almak ve inanılmaz sonuçlar elde etmek için Vernik'i kullanabiliriz.
Bunlar bir Wordpress kurulumunda yararlı olabilecek bazı kurallardır:
sub vcl_recv{
# Let's make sure we aren't compressing already compressed formats.
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|mp3|mp4|m4v)(\?. * |)$") {
remove 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 {
remove req.http.Accept-Encoding;
}
}
if (req.url ~ "^/$") {
unset req.http.cookie;
}
# Unset all cookies if not Wordpress admin - otherwise login will fail
if (!(req.url ~ "wp-(login| admin )")) {
unset req.http.cookie;
return(lookup);
}
# If you request the special pages go directly to them
if (req.url ~ "wp-(login| admin )") {
return (pipe);
}
}
sub vcl_miss {
if (!(req.url ~ "wp-(login| admin )")) {
unset req.http.cookie;
}
if (req.url ~ "^/+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") {
unset req.http.cookie;
set req.url = regsub(req.url, "\?.$", "");
}
if (req.url ~ "^/$") {
unset req.http.cookie;
}
}
sub vcl_fetch {
if (req.url ~ "^/$") {
unset beresp.http.set-cookie;
}
# Unset all cookies if not Wordpress admin - otherwise login will fail
if (!(req.url ~ "wp-(login| admin )")) {
unset beresp.http.set-cookie;
}
}
Bu örnekte, web sitemizdeki tüm sayfaları önbelleğe aldığımızı görebilirsiniz, ancak url'de "wp-admin" veya "wp-login" olanlar için dizelerin oturum açmak için kullanılan "özel" konumlar olduğunu görebilirsiniz. Yönetici olarak Wordpress. Bu nedenle, doğrudan Web sunucusuyla konuşmak ve Vernik önbelleğini atlamak istiyoruz.
Doğal olarak, Drupal, Joomla veya özel yapım bir web sitesi kullanıyorsanız, bu kuralları değiştirmeniz gerekir, ancak amaç her zaman aynıdır: Tüm dinamik sayfaları ve önbelleği göndermek için arka ucunuza yapabilirsiniz.
Standart ++: Sunucu Esnekliğini Artırın
Bazen Web sunucuları yavaşlar çünkü yükleri fazladır. Vernik bu konuda da yardımcı olabilir. Varnish'e arka uçla çalışmıyorsa veya çok yavaş yanıt veriyorsa konuşmaktan kaçınmasını söylemek için bazı özel yönergeler kullanabiliriz. Bu durumlarda Varnish "grace" direktifini kullanır.
Vernik kapsamındaki zarafet, koşullar gerektirdiğinde süresi dolmuş nesnelerin teslim edilmesi anlamına gelir. Bu olabilir çünkü:
- Seçilen arka uç yönetmen çalışmıyor
- Farklı bir iş parçacığı zaten arka uca henüz bitmemiş bir istekte bulundu.
sub vcl_recv {
if (req.backend.healthy) {
set req.grace = 30s;
} else {
set req.grace = 1h;
}
}
sub vcl_fetch {
set beresp.grace = 1h;
}
Bu konfigürasyon Varnish'e arka ucunu test etmesini ve bazı problemleri varsa ödemesiz süreyi yükseltmesini söyler. Yukarıdaki örnek ayrıca bir arka ucu kontrol etmek için kullanılan "req.backend.healthy" yönergesini de sunmaktadır. Bu, birden fazla arka ucunuz olduğunda gerçekten yararlıdır, bu yüzden daha gelişmiş bir örneğe bakalım.
Gelişmiş Kullanım: Dağıtılmış Bir Ortamda Dayanıklı Bir Web Sunucusu Oluşturma
Bu, şimdiye kadar gördüğümüz tüm seçeneklerle son yapılandırma dosyamız ve sonda için bazı özel direktiflerle iki arka uç tanımı. Vernik bir Web sunucusunun canlı olup olmadığını bu şekilde belirler.
.url
Vernik, bu URL ile arka uçtan istekte bulunacaktır.
.zaman aşımı
Probun ne kadar hızlı bitmesi gerektiğini belirler. "0, 1 sn", "1230 ms" veya hatta "1 sa" gibi bir sayı içeren bir zaman birimi belirtmelisiniz.
.Aralık
Anketler arasında ne kadar bekleyeceğiniz. Burada da bir zaman birimi belirtmelisiniz. Bunun bir "ücret" değil, "aralık" olduğuna dikkat edin. En düşük anket oranı (.timeout + .interval).
.window
Arka ucun sağlıklı olup olmadığını belirlerken en son anketlerden kaç tanesi dikkate alınmalıdır.
.eşik
Arka uç sağlıklı olarak bildirilmek için .window son anketlerinden kaç tanesi iyi olmalıdır.
Şimdi "req.backend.healthy" direktifini kullanabilir ve arka uçların canlı olup olmadığını bize bildiren bir Boolean sonucu elde edebiliriz.
#
# Customized VCL file for serving up a Wordpress site with multiple back-ends.
#
# Define the internal network subnet.
# These are used below to allow internal access to certain files while not
# allowing access from the public internet .
acl internal {
"10.100.0.0"/24;
}
# Define the list of our backends (web servers), they Listen on port 8080
backend web1 { .host = "10.100.0.1"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}
backend web2 { .host = "10.100.0.2"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}
# Define the director that determines how to distribute incoming requests.
director default_director round-robin {
{ .backend = web1; }
{ .backend = web2; }
}
# Respond to incoming requests.
sub vcl_recv {
set req.backend = default_director;
# Use anonymous, cached pages if all backends are down.
if (!req.backend.healthy) {
unset req.http.Cookie;
set req.grace = 6h;
} else {
set req.grace = 30s;
}
# Unset all cookies if not Wordpress admin - otherwise login will fail
if (!(req.url ~ "wp-(login| admin )")) {
unset req.http.cookie;
return(lookup);
}
# If you request the special pages go directly to them
if (req.url ~ "wp-(login| admin )") {
return (pipe);
}
# Always cache the following file types for all users.
if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {
unset req.http.Cookie;
}
}
# Code determining what to do when serving items from the web servers.
sub vcl_fetch {
# Don't allow static files to set cookies.
if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {
# beresp == Back-end response from the web server.
unset beresp.http.set-cookie;
}
# Allow items to be stale if needed.
set beresp.grace = 6h;
}
Güçlü Bir Araç
Bunlar, Vernik kullanmaya başlamanıza yardımcı olabilecek bazı örneklerdir. Bu araç gerçekten güçlü ve daha fazla donanım veya sanal makine satın almadan harika bir performans artışı elde etmenize yardımcı olabilir. Birçok web sitesi yöneticisi için bu gerçek bir avantajdır.