Кэширование с Varnish

Varnish — это гибкое решение для кэширования страниц на уровне Web сервера.

Установка и запуск

Varnish можно поставить практически на все известные дистрибутивы линуксов и юниксов. Для Debian все выглядит так:

sudo apt-get install varnish

Общая архитектура

Varnish + Nginx

Обычно Varnish ставится перед другим Web сервером на 80 порт. Таким образом он будет принимать все запросы от клиентов. Если Varnish на 80 порту нежелателен (например, он может хуже справляться с обработкой запросов, чем Nginx), его можно поставить на другой порт (6081) и организовать связку Nginx[80]-Varnish[6081]-Nginx[81].

Мы рассмотрим случай, когда Varnish слушает 80 порт.

Включение кэша

В случае с Debian, необходимо настроить параметры запуска Varnish в файле:

nano /etc/default/varnish

В параметре DAEMON_OPTS указываем:

DAEMON_OPTS="-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
<b>-t 120 \
-s malloc,256m</b>"

# Мы установим 256Мб на размер кэша и время кэширования в 120 секунд по умолчанию

VCL

Varnish VCL

VCL позволяет гибко настроить работу кэша. Файл с настройками обычно находится тут:

nano /etc/varnish/default.vcl

Файл делится на несколько секций, но то что нужно для начала работы — это указание бекендов. Бекенд — это адрес сервера, на который Varnish будет отправлять запросы, если у него в кэше ничего нет. Ответ от бекендов будет кэшироваться.

backend www {
	.host = "127.0.0.1"; 
	.port = "81";
}

# Varnish будет отправлять запросы на 81 порт

На 81 порту теперь должен быть доступен наш основной сайт, т.е. главный сервер нужно перенести на 81 порт. Если это Nginx:

server {
        listen 81;
        ...
}

Чтобы все заработало, перезапускаем Varnish:

/etc/init.d/varnish restart

VCL является почти целым языком разработки. Все инструкции необходимо писать в файл default.vcl (не забывая убрать комментарии с соотв. секций).

Cookie и статика

По умолчанию Varnish не будет кэшировать запросы, для которых установлены Cookie. Но это не имеет смысла для статики. Для этого можно вырезать Cookie в процедуре vcl_recv:

sub vcl_recv {
...
        if (req.url ~ "\.(css|js|png|gif|jp(e)?g)") {
                unset req.http.cookie;
        }
...
return (lookup);
}

Большие файлы

Если мы не хотим, чтобы кэш забивался огромными файлами (например, если у нас на сайте есть видео/музыка), нам нужно использовать инструкцию pass:

sub vcl_recv {
...
        if (req.url ~ "\.(mp4|mp3|avi)") {
                return (pass);
        }
...
return (lookup);
}

Время кэша (ttl)

VCL также позволяет переопределять время кэша. Это позволит использовать разное время для разных условий:

sub vcl_recv {
	set req.grace = 2m;
        if (req.url ~ "\.(png|jpe?g|gif)") {
                set req.grace = 1h;
        }
}

sub vcl_fetch {
   set beresp.grace = 1h;
}

# Кэшируем все на 2 минуты, картинки на 1 час и сохраняем все минимум на 1 час

Динамические страницы

Varnish поддерживает специальный механизм кэширования динамических страниц с помощь ESI.

Самое важное

Использование кэширования часто снижает нагрузку на сервер в несколько десятков или даже сотен раз.


Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень