Установка и настройка Varnish с NGINX в Ubuntu 18.04

Начнём с обновления пакетов:

apt update
apt upgrade

Вносим изменения в настройках nginx, для смены порта на котором работает сайт:

nano /etc/nginx/sites-enabled/default
nano /etc/nginx/sites-enabled/<site_name>

вносим изменения в строки listen:

listen 8080 default_server;
listen [::]:8080 default_server;

Сохраняем настройки, проверяем конфигурацию nginx:

nginx -t

Мы должны увидеть что-то подобное:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

перезапускаем nginx
systemctl stop nginx
systemctl start nginx

Переходим к настройке Varnish,

nano /etc/varnish/default.vcl

Вносим изменения — порт на котором находится backend:

backend default {
.host = «127.0.0.1»;
.port = «8080»;
}

Вносим измения в файл службы varnish:

nano /lib/systemd/system/varnish.service

Изменяем строку ExecStart, увеличиваем объём выделенной памяти для кэша (кэш будет хранится в оперативной памяти):

ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,1024m

Перезапускаем службы:

systemctl daemon-reload

Запускаем vanish и добавляем его включение при перезагрузке:

systemctl start varnish
systemctl enable varnish

Проверяем состояние службы:

systemctl status varnish
● varnish.service --- Varnish HTTP accelerator
Loaded: loaded (/lib/systemd/system/varnish.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-04-02 12:32:25 MSK; 2s ago
Docs: https://www.varnish-cache.org/docs/4.1/
man:varnishd
Main PID: 14122 (varnishd)
Tasks: 217 (limit: 4915)
CGroup: /system.slice/varnish.service
├─14122 /usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,1024m
└─14151 /usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,1024m
Apr 02 12:32:25 ruiptvru systemd[1]: Started Varnish HTTP accelerator.
Apr 02 12:32:26 ruiptvru varnishd[14122]: Debug: Platform: Linux,4.15.0-136-generic,x86_64,-junix,-smalloc,-smalloc,-hcritbit
Apr 02 12:32:26 ruiptvru varnishd[14122]: Platform: Linux,4.15.0-136-generic,x86_64,-junix,-smalloc,-smalloc,-hcritbit
Apr 02 12:32:26 ruiptvru varnishd[14122]: Debug: Child (14151) Started
Apr 02 12:32:26 ruiptvru varnishd[14122]: Child (14151) Started

Убеждаемся, что служба слушает нужные нам порты:
ss -antpl | grep varnishd
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:((«cache-main»,pid=14151,fd=3),(«varnishd»,pid=14122,fd=3))
LISTEN 0 10 127.0.0.1:6082 0.0.0.0:* users:((«varnishd»,pid=14122,fd=7))
LISTEN 0 128 [::]:80 [::]:* users:((«cache-main»,pid=14151,fd=4),(«varnishd»,pid=14122,fd=4))
Просмотр статистики кэша Varnish сервера
varnishstat -1 | grep -i cache
MAIN.cache_hit 14364 0.84 Cache hits
MAIN.cache_hitpass 0 0.00 Cache hits for pass.
MAIN.cache_hitmiss 0 0.00 Cache hits for miss.
MAIN.cache_miss 114 0.01 Cache misses

Как ещё узнать, что Varnish точно работает

curl -I http://localhost
HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)
Date: Fri, 02 Apr 2021 14:21:38 GMT
Content-Type: text/html
Last-Modified: Thu, 26 Dec 2019 12:26:50 GMT
Vary: Accept-Encoding
ETag: W/»5e04a70a-a9″
X-Varnish: 334011
Age: 0
Via: 1.1 varnish (Varnish/5.2)
Accept-Ranges: bytes

Дополнительные настройки

Открываем конфигурационный файл vanish

nano /etc/varnish/default.vcl

и вносим изменения в секцию

sub vcl_backend_response {
# Вначале мы устанавливаем значение TTL для большинства контента, который нужно кэшировать
set beresp.ttl = 10m;
set beresp.grace = 2h;

# Теперь мы можем установить особые TTL основываясь на контенте, который нужно кэшировать
# Для VoD мы устанавливаем средне-длинный TTL и долгий льготный (grace) период, поскольку VoD
# контент не склонен к изменению. Это позволяет нам использовать этот кэш
# для самого часто запрашиваемого контента

if (bereq.url ~ «/vod») {
set beresp.ttl = 30m;
set beresp.grace = 24h;
}

# Для живого контента мы используем очень маленькое TTL и ещё меньших льготный период
# поскольку живой контент больше не *живой* как только он был потреблён

if (bereq.url ~ «/url») {
set beresp.ttl = 10s;
set beresp.grace = 2s;
}

# Мы увеличиваем продолжительность *keep* (хранения) для IMS

if (bereq.http.If-Modified-Since) {
set beresp.keep = 10m;
}
}

Как исключить из кэширования определённые страницы

Для исключения из кэширования всех путей, содержащих в любом месте URL строку «/путь/для/исключения/»:

sub vcl_recv {
    if (req.url ~ "^/путь/для/исключения/") {
        return (pass);
    }
}

Обратите внимание, что символ ~ (тильда) означает, что поиск выполняется по регулярному выражению. А символ ^ (каретка) означает начало строки.

Если вы хотите, чтобы были исключены URL, в которых «/путь/для/исключения/» встречается в любой части URL, то уберите символ ^, например:

sub vcl_recv {
    if (req.url ~ "/путь/для/исключения/") {
        return (pass);
    }
}
Если вы хотите, чтобы поиск выполнялся не по регулярному выражению, а по точному совпадению, то замените ~ на ==, например:
sub vcl_recv {
    if (req.url == "/путь/для/исключения/") {
        return (pass);
    }
}
Вы можете использовать конструкцию if () {} несколько раз или объединить их в одну. Символ || означает логическое «ИЛИ»:
sub vcl_recv {
    if (req.url ~ "myip" || req.url ~ "proxy-checker" || req.url ~ "my-user-agent") {
        return (pass);
    }
}

То есть предыдущая настройка исключит из кэширования все страницы, в любом месте URL которых встречается строка «myip» или строка «proxy-checker» или строка «my-user-agent».

Пример, в котором для хоста suip.biz исключаются из кэша страницы, содержащие в URL строку «/ru»:

sub vcl_recv {
    if (req.http.host == "suip.biz" && req.url == "/ru") {
        return (pass);
    }
}

Как исключить из кэширования домашнюю страницу

В следующем примере для хоста suip.biz исключается из кэша домашняя страница:

sub vcl_recv {
    if (req.http.host == "xakinfo.ru" && req.url == "/") {
        return (pass);
    }
}

Как увеличить таймаут соединения в Varnish

Если отправка данных от Varnish клиенту не закончена в течение 60 секунд, то такое соединение прерывается. Для обычных сайтов это нормально, но для видео порталов или сервисов, выполняющих продолжительное действие, этого может не хватить.

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

varnishadm param.show | grep timeout
Пример вывода:
backend_idle_timeout          60.000 [seconds] (default)
between_bytes_timeout         60.000 [seconds] (default)
cli_timeout                   60.000 [seconds] (default)
connect_timeout               3.500 [seconds] (default)
first_byte_timeout            60.000 [seconds] (default)
idle_send_timeout             60.000 [seconds] (default)
pipe_timeout                  60.000 [seconds] (default)
send_timeout                  60.000 [seconds] (default)
thread_pool_timeout           300.000 [seconds] (default)
timeout_idle                  5.000 [seconds] (default)
timeout_linger                0.050 [seconds] (default)

Нужный нам параметр, отвечающий за максимальное время отправки данных в течение одного соединения, называется send_timeout.Чтобы его изменить, необходимо отредактировать строку командыsystemctl edit —full varnishДобавьте к команде опцию вида:

-p send_timeout=СЕКУНДЫ

Например, чтобы установить таймаут соединения на 10 минут:

-p send_timeout=600

Обратите внимание, что нельзя указывать суффикс «s» или любой другой, иначе программа не запустится. Нужно указать только число, означающие секунды для таймаута соединения.

Этой настройкой мы изменили значение максимального времени отправки данных. Но есть ещё один таймаут, который устанавливает максимальную продолжительность соединения. Для его редактирования откройте файл /etc/varnish/default.vcl и добавьте туда настройки:

backend default {
    .connect_timeout = 600s;
    .first_byte_timeout = 600s;
    .between_bytes_timeout = 600s;
}

Чтобы не редактировать опции запуска службы, я пытался добавить опцию send_timeout в конфигурационный файл, но в этом случае служба не запускается из-за ошибки. Если вы знаете, в чём дело и как обойтись без добавления опции в строке команды, то пишите в комментариях.

Чтобы изменения вступили в силу, перезагрузите службу varnish:

systemctl restart varnish

Дополнительная информация:

Дополнительная документация:

Добавить комментарий