Зміст:
- Вступ до лаку
- Основи: зображення кешу
- Стандарт: зображення кешу та сторінки кешу
- Стандарт ++: Підвищення стійкості сервера
- Розширене використання: Створення стійкого веб-сервера в розподіленому середовищі
- Потужний інструмент
Що стосується продуктивності веб-сайту, 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 використовує файли cookie, тому ми маємо їх усунути в цьому типі запиту, щоб вони були однаковими для лаку:
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;
}
}
Ви можете бачити, що в цьому прикладі ми кешуємо всі сторінки з нашого веб-сайту, але для тих, у яких у URL-адресі є "wp-admin" або "wp-login", рядки - це "спеціальні" місця, які використовуються для входу в Wordpress як адміністратор. Таким чином, ми хочемо поговорити безпосередньо з веб-сервером і обійти кеш лаку.
Природно, якщо ви використовуєте 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-адреси.
.час вийшов
Визначає, як швидко зонд повинен закінчитися. Ви повинні вказати одиницю часу з числом, наприклад, "0, 1 с", "1230 мс" або навіть "1 год".
.інтервал
Як довго чекати між опитуваннями. Тут також потрібно вказати одиницю часу. Зауважте, що це не "швидкість", а "інтервал". Найнижчий показник опитування - (.timeout + .interval).
. вікно
Скільки останніх опитувань слід врахувати, визначаючи, чи здоровий задній кінець.
.пороговість
Скільки останніх опитувань .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. Цей інструмент справді потужний і може допомогти вам досягти значного підвищення продуктивності без придбання більше апаратних чи віртуальних машин. Для багатьох адміністраторів веб-сайтів це реальна вигода.