Дом Програмное обеспечение Лак: готовься к черту!

Лак: готовься к черту!

Оглавление:

Anonim

Когда дело доходит до производительности сайта, 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 означает доставку предметов с истекшим сроком действия, когда этого требуют обстоятельства. Это может произойти, потому что:

  • Выбранный бэк-директор недоступен
  • Другой поток уже сделал запрос к серверной части, которая еще не завершена.
Оба случая обрабатываются одинаково в VCL:

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. Этот инструмент действительно мощный и может помочь вам значительно повысить производительность, не покупая больше оборудования или виртуальных машин. Для многих администраторов сайтов это реальная выгода.

Лак: готовься к черту!