Установка Varnish Cache на Ubuntu 20/21, CentOS, Redhat, Node, Python, Gem

Varnish Cache — это ускоритель веб-приложений, также известный как кэширующий обратный прокси-сервер HTTP. Вы устанавливаете его перед любым сервером, который говорит по протоколу HTTP, и настраиваете его для кэширования содержимого. Varnish Cache очень, очень быстрый. Обычно это ускоряет доставку в 300-1000 раз, в зависимости от вашей архитектуры.

Прежде чем вы начнете, вам понадобится полностью обновленный сервер Ubuntu Linux и учетная запись пользователя sudo.

Быстрая установка (Debian-like)
curl -s https://packagecloud.io/install/repositories/varnishcache/varnish70/script.deb.sh | sudo bash
Быстрая установка (Redhat-like (CentOS, Redhat, Oracle, etc))
curl -s https://packagecloud.io/install/repositories/varnishcache/varnish70/script.rpm.sh | sudo bash
Node
curl -s https://packagecloud.io/install/repositories/varnishcache/varnish70/script.node.sh | bash
Python
curl -s https://packagecloud.io/install/repositories/varnishcache/varnish70/script.python.sh | bash
Gem
curl -s https://packagecloud.io/install/repositories/varnishcache/varnish70/script.gem.sh | bash

Ручная установка на Ubuntu 20

Обновим локальный индекс пакетов.
sudo apt update
Установим Apache
sudo apt install apache2
Настроим брандмауэр для разрешения трафика.
sudo ufw allow http
sudo ufw allow https
Настраиваем Apache
Измените порт по умолчанию в Apache с 80 на 8080.
sudo sed -i -e 's/80/8080/g' /etc/apache2/ports.conf
sudo sed -i -e 's/80/8080/g' /etc/apache2/sites-available/*
Если вы добавите больше сайтов позже, вам необходимо вручную изменить их порты в соответствующих файлах в каталоге /etc/apache2/sites-available/.

Перезапустите Apache.
sudo systemctl restart apache2
Убедитесь, что Apache прослушивает порт 8080.
sudo netstat -pnlt | grep 8080
Вывод:
tcp6 0  0 :::8080  :::*  LISTEN  5987/apache2

Установим Varnish

Вы должны добавить официальный репозиторий кэша Varnish для установки LTS-версии Varnish, поскольку репозиторий Ubuntu по умолчанию содержит более старые, неподдерживаемые версии.

Добавьте необходимые зависимости.
sudo apt install curl gnupg apt-transport-https
Установите ключ GPG для пакета.
curl -L https://packagecloud.io/varnishcache/varnish60lts/gpgkey | sudo apt-key add -
Добавьте репозиторий.
echo "deb https://packagecloud.io/varnishcache/varnish70/ubuntu/ focal main" | sudo tee -a /etc/apt/sources.list.d/varnish70.list
Укажите более высокий приоритет для этого репозитория, чем пакет по умолчанию, доступный в Ubuntu.
sudo nano /etc/apt/preferences.d/varnish
Добавьте в файл следующее содержимое.
Package: varnish
Pin: origin packagecloud.io
Pin-Priority: 900
Обновите локальный индекс пакетов.
sudo apt update
Установите Varnish.
sudo apt install varnish

Настраиваем Varnish

Проверьте адрес и конфигурацию порта по умолчанию.

Откройте файл конфигурации Varnish по умолчанию.
sudo nano /etc/varnish/default.vcl
Убедитесь, что раздел серверной части по умолчанию указывает на localhost (127.0.0.1) на порту 8080.
backend default {
.host = "127.0.0.1";
.port = "8080";
}
Сохраните и закройте файл.

Настройте Varnish для прослушивания через порт 80 вместо значения по умолчанию 6081.

Создайте каталог для пользовательского файла конфигурации.
sudo mkdir /etc/systemd/system/varnish.service.d
Создайте файл.
sudo nano /etc/systemd/system/varnish.service.d/customport.conf
Добавьте в файл следующее содержимое.
[Service]
ExecStart=
ExecStart=/usr/sbin/varnishd -a :80 -a localhost:8443,PROXY -p feature=+http2 -f /etc/varnish/default.vcl -s malloc,256m
Добавьте в файл следующее содержимое.
sudo systemctl daemon-reload
Перезапустите Varnish.
sudo systemctl restart varnish
Убедитесь, что Varnish прослушивает порт 80.
sudo netstat -ltnp | grep ':80 '
Вывод:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6242/varnishd
tcp6 0 0 :::80 :::* LISTEN 6242/varnishd

Тестируем Varnish

Используйте curl, чтобы сделать HTTP-запрос и проверить, что в выходных данных отображаются заголовки X-Varnish: 32778 32776 и Via: 1.1 Varnish (Varnish/7.0).
curl -I http://localhost/
Вывод:
HTTP/1.1 200 OK
Date: Thu, 14 Oct 2021 13:29:54 GMT
Server: Apache/2.4.41 (Ubuntu)
Last-Modified: Thu, 14 Oct 2021 13:25:29 GMT
Vary: Accept-Encoding
Content-Type: text/html
X-Varnish: 32778 32776
Age: 20
Via: 1.1 varnish (Varnish/7.0)
ETag: W/"2aa6-5ce50032ad812-gzip"
Accept-Ranges: bytes
Content-Length: 10918
Connection: keep-alive

Расширенные настройки Varnish

Как использовать кэширование браузера для медиафайлов
Откройте файл Varnish default.vcl.
sudo nano /etc/varnish/default.vcl
Найдите подраздел vcl_backend_response и добавьте следующее.
sub vcl_backend_response {
if (bereq.url ~ "\.(png|gif|jpg|swf|css|js)$") {
unset beresp.http.set-cookie;
set beresp.http.cache-control = "max-age = 2592000";
}
}
Это указывает браузеру пользователя кэшировать файлы png, gif, jpg, swf, css и js в течение 30 дней.

Как очистить кэш

Если вам нужно очистить кэш Varnish вручную, вы можете очистить весь кэш с помощью:
sudo varnishadm 'ban req.url ~ .'
Или вы можете очистить записи кэша для одного домена, например vasya.ru:
sudo varnishadm 'ban req.http.host ~ vasya.ru'

Поиск и устранение неисправностей

Если curl возвращает ошибку HTTP/1.1 503 Backend fetch failed, проверьте файл default.vcl.
sudo nano /etc/varnish/default.vcl
Убедитесь, что раздел серверной части по умолчанию указывает на Apache через порт 8080.
backend default {
.host = "127.0.0.1";
.port = "8080";
}