Съдържание:
- Въведение в лака
- Основите: кеш изображения
- Стандартът: Кеш изображения и страници
- Стандартът ++: Увеличете устойчивостта на сървъра
- Разширено използване: Създайте устойчив уеб сървър в разпределена среда
- Мощен инструмент
Що се отнася до ефективността на уебсайта, Varnish е гореща технология. С проста инсталация и конфигурация е възможно да се повиши производителността на всеки уебсайт и да се обслужват до милион страници само с малък виртуален частен сървър., Ще ви покажа четири възможни конфигурации, които ще ви помогнат да подобрите времето за реакция на вашия сайт, независимо дали обслужвате стотици, хиляди или милиони страници.
Въведение в лака
Varnish-Cache е уеб ускорител с цел кеширане на съдържанието на уебсайта. Това е проект с отворен код, който има за цел да оптимизира и ускори достъпа до уебсайтове неинвазивно - без да променя кода - и да ви позволи да поставите ръцете си в уебсайта си.
Създателите на Varnish Cache го нарекоха уеб ускорител, тъй като основната му цел е да подобри и ускори предната страна на уебсайта. Лак постига това чрез съхраняване на копия на страниците, обслужвани от уеб сървъра в кеша си. Следващият път, когато бъде поискана същата страница, Varnish ще обслужва копието, вместо да поиска страницата от уеб сървъра, което води до огромно повишаване на производителността.
Друга от основните характеристики на Varnish Cache, в допълнение към неговата производителност, е гъвкавостта на езика му за конфигурация, VCL. VCL дава възможност за писане на правила за това как трябва да се обработват входящите заявки. В такава политика можете да решите какво съдържание искате да покажете, откъде искате да получите съдържанието и как искането или отговорът трябва да се променят.
В следващите примери за конфигурация ще ви покажа кои правила VCL да използвате, за да постигнете някои цели, от обикновено кеширане на изображения и статични обекти, до използване на Varnish в разпределена среда или принуждаването му да действа като балансиращо натоварване.
Всички следващи примери са за лак 3.x. Моля, обърнете внимание, че Varnish 2.x използва различни синтаксиси и правила, така че тези примери не са съвместими с тази версия.
По-долу са основните състояния на Varnish, които ще използваме във конфигурационния файл VCL:
Получ
Това е първата функция, която се извиква при получаване на заявка. Тук можем да манипулираме заявката, преди да отидем да проверим дали тя присъства в кеша. Ако заявката не може да бъде поставена в кеш памет, в тази фаза може да бъде избран и резервният сървър, към който ще бъде изпратена заявката.
минавам
Можем да използваме тази функция, когато искаме да предадем заявката на уеб сървъра и да кешираме отговора.
тръба
Тази функция заобикаля Varnish и изпраща заявката до уеб сървъра.
погледни нагоре
С търсене, Varnish моли да провери дали отговорът е наличен и валиден в кеша.
донасям
Тази функция се извиква, след като възстановяването на съдържанието от задния край се извиква от пропуск или пропуск.
Основите: кеш изображения
Затова нека разгледаме пример за конфигурация. В този първи пример просто ще кешираме изображенията и статичните файлове като CSS файлове. Тази конфигурация е наистина полезна, когато не знаете уебсайта, който искате да увеличите, така че можете просто да решите, че всички изображения, CSS и JavaScript са еднакви за всички потребители. За да се разграничат потребителите, HTTP протоколът използва бисквитки, така че трябва да ги елиминираме в този тип заявки, така че те да са еднакви за Varnish:
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;
}
И това е. С този VCL файл можете лесно да кеширате статично съдържание.
Стандартът: Кеш изображения и страници
Обикновено не искате просто да кеширате статичното съдържание на уебсайта си, но също така искате да кеширате динамични страници, генерирани от вашия уеб сървър, но те са еднакви за всички потребители - или поне за всички ваши анонимни потребители. В тази фаза трябва да знаете кои страници могат да се кешират и кои не могат.
Добър пример е Wordpress, една от най-често използваните системи за управление на съдържанието. Wordpress генерира страници на уебсайтове динамично с PHP и запитва към MySQL база данни. Това е хубаво, защото можете лесно да актуализирате уебсайта си от администраторския интерфейс с няколко кликвания, но също така е скъп по отношение на използваните ресурси. Защо да стартирате един и същ PHP скрипт и MySQL заявка всеки път, когато потребител кацне на началната страница? Можем да използваме Varnish, за да кешираме най-посещаваните страници и да постигнем невероятни резултати.
Това са някои правила, които могат да бъдат полезни при инсталация на Wordpress:
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;
}
}
Можете да видите, че в този пример кешираме всички страници от нашия уебсайт, но за тези, които имат „wp-admin“ или „wp-login“ в URL адреса, низовете са „специални“ места, използвани за влизане в Wordpress като администратор. Като такъв, ние искаме да говорим директно с уеб сървъра и да заобиколим кеша на Varnish.
Естествено, ако използвате Drupal, Joomla или уебсайт, създаден по поръчка, трябва да промените тези правила, но целта винаги е една и съща: да изпратите всички динамични страници и кеш, които можете, до задния си край.
Стандартът ++: Увеличете устойчивостта на сървъра
Понякога уеб сървърите стават бавни, защото имат високо натоварване. Лакът може да помогне и за това. Можем да използваме някои специални директиви, за да кажем на Varnish, за да избягваме да говорите със задния край, ако той е надолу или отговаря твърде бавно. За тези случаи Варниш използва директивата "благодат".
Изящество в обхвата на Лак означава доставяне на иначе изтекли предмети, когато обстоятелствата го изискват. Това може да се случи, защото:
- Избраният бек-енд директор е отпаднал
- Друга нишка вече направи заявка към задния край, който все още не е завършен.
sub vcl_recv {
if (req.backend.healthy) {
set req.grace = 30s;
} else {
set req.grace = 1h;
}
}
sub vcl_fetch {
set beresp.grace = 1h;
}
Тази конфигурация казва на Varnish да тества задния край и да повдигне гратисния период, ако има някакви проблеми. Примерът по-горе също въвежда директивата "req.backend.healthy", която се използва за проверка на задния край. Това е наистина полезно, когато имате няколко задни краища, така че нека разгледаме по-напреднал пример.
Разширено използване: Създайте устойчив уеб сървър в разпределена среда
Това е нашият финален конфигурационен файл с всички опции, които видяхме досега и дефиницията на два задни завършва с някаква специална директива за сондата. Ето как Varnish определя дали уеб сървърът е жив или не.
.url
Лак ще отправя заявки към задния край с този URL адрес.
.timeout
Определя колко бързо трябва да завърши сондата. Трябва да посочите единица време с число, като например "0, 1 s", "1230 ms" или дори "1 h".
.interval
Колко време да чакаме между анкетите. Тук също трябва да посочите единица време. Забележете, че това не е "процент", а "интервал". Най-ниската степен на анкета е (.timeout + .interval).
.window
Колко от последните анкети трябва да се вземат предвид при определяне дали задният край е здрав.
.threshold
Колко от последните анкети на .window трябва да са добри, за да може задният край да бъде обявен за здрав.
Сега можем да използваме директивата "req.backend.healthy" и да получим булев резултат, който ни казва дали задният край (и) са живи или не.
#
# 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;
}
Мощен инструмент
Това са само някои примери, които могат да ви помогнат да започнете да използвате Varnish. Този инструмент е наистина мощен и може да ви помогне да постигнете голямо повишаване на производителността, без да купувате повече хардуер или виртуални машини. За много администратори на уебсайтове това е реална полза.