Оглавление:
- Введение в лак
- Основы: кэширование изображений
- Стандарт: кэшировать изображения и страницы
- Стандарт ++: повышение устойчивости сервера
- Расширенное использование: создание отказоустойчивого веб-сервера в распределенной среде
- Мощный инструмент
Когда дело доходит до производительности сайта, Varnish - это горячая технология. Благодаря простой установке и настройке, можно повысить производительность любого веб-сайта и обслуживать до миллиона страниц только с помощью небольшого виртуального частного сервера. Я покажу вам четыре возможные конфигурации, которые помогут вам улучшить время отклика вашего сайта, независимо от того, обслуживаете ли вы сотни, тысячи или миллионы страниц.
Введение в лак
Varnish-Cache - это веб-ускоритель с целью кэширования содержимого веб-сайта. Это проект с открытым исходным кодом, который направлен на неинвазивную оптимизацию и ускорение доступа к веб-сайтам - без изменения кода - и позволяет вам приложить руки к своему веб-сайту.
Именно создатели Varnish Cache назвали его веб-ускорителем, поскольку его основная задача - улучшить и ускорить работу веб-сайта. Varnish достигает этого, храня копии страниц, обслуживаемых веб-сервером, в своем кэше. При следующем запросе той же страницы Varnish будет обслуживать копию, а не запрашивать страницу с веб-сервера, что приведет к значительному повышению производительности.
Еще одной из ключевых особенностей Varnish Cache, помимо его производительности, является гибкость языка конфигурации VCL. VCL позволяет писать политики о том, как следует обрабатывать входящие запросы. В такой политике вы можете решить, какой контент вы хотите обслуживать, откуда вы хотите получить контент и как следует изменить запрос или ответ.
В следующих примерах конфигурации я покажу вам, какие правила VCL использовать для достижения некоторых целей, от простого кэширования изображений и статических объектов до использования Varnish в распределенной среде или использования его в качестве балансировщика нагрузки.
Все следующие примеры для Varnish 3.x. Обратите внимание, что Varnish 2.x использует другой синтаксис и правила, поэтому эти примеры не совместимы с этой версией.
Ниже приведены основные состояния Varnish, которые мы будем использовать в файле конфигурации VCL:
RECV
Это первая функция, которая вызывается при получении запроса. Здесь мы можем манипулировать запросом, прежде чем проверять его наличие в кэше. Если запрос не может быть помещен в кэш, на этом этапе также можно выбрать внутренний сервер, на который будет отправлен запрос.
проходят
Мы можем использовать эту функцию, когда хотим передать запрос на веб-сервер и кэшировать ответ.
труба
Эта функция обходит 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;
}
}
Вы можете видеть, что в этом примере мы кэшируем все страницы нашего веб-сайта, но для тех, у которых в URL-адресе есть «wp-admin» или «wp-login», строки представляют собой «специальные» места, используемые для входа в систему. Wordpress как администратор. Поэтому мы хотим напрямую общаться с веб-сервером и обходить кеш Varnish.
Естественно, если вы используете Drupal, Joomla или пользовательский веб-сайт, вы должны изменить эти правила, но цель всегда одна и та же: отправить все динамические страницы и кеш вы можете на свой сервер.
Стандарт ++: повышение устойчивости сервера
Иногда веб-серверы становятся медленными из-за высокой нагрузки. Лак может помочь с этим тоже. Мы можем использовать некоторые специальные директивы, чтобы сообщить Varnish, чтобы он не разговаривал с серверной частью, если он не работает или отвечает слишком медленно. Для этих случаев Varnish использует директиву «Благодать».
Благодать в сфере 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
Varnish будет отправлять запросы на сервер с этим URL.
.timeout
Определяет, как быстро датчик должен закончить. Вы должны указать единицу времени с числом, таким как «0, 1 с», «1230 мс» или даже «1 ч».
.interval
Как долго ждать между опросами. Вы также должны указать здесь единицу времени. Обратите внимание, что это не «скорость», а «интервал». Самая низкая частота опроса (.timeout + .interval).
.окно
Сколько последних опросов следует учитывать при определении работоспособности серверной части.
.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. Этот инструмент действительно мощный и может помочь вам значительно повысить производительность, не покупая больше оборудования или виртуальных машин. Для многих администраторов сайтов это реальная выгода.