Скорость загрузки сайта критически важна для пользователей. Разбираемся, как использовать Varnish Cache для кеширования, разгрузить веб-сервер (VPS) и ускорить отдачу контента.
Введение
Скорость работы сайта — это один из ключевых факторов, напрямую влияющих на пользовательский опыт и успех веб-проекта. Посетители ожидают мгновенной загрузки страниц, а задержки могут привести к росту отказов и потере потенциальных клиентов. Особенно остро эта проблема проявляется при росте трафика, когда веб-серверу приходится обрабатывать множество идентичных запросов, выполняя одни и те же ресурсоёмкие операции: обращение к базе данных, сборку динамического контента и генерацию страниц.
Решением этой задачи становится кеширование контента на уровне HTTP-запросов с помощью Varnish Cache — высокопроизводительного кеширующего прокси-сервера, способного разгрузить основной веб-сервер за счёт хранения готовых ответов в оперативной памяти. В этой статье мы разберём принципы его работы, преимущества использования и подробно рассмотрим настройку Varnish на Ubuntu 24.04 для ускорения веб-проектов любой сложности.
Как работает Varnish
Varnish Cache — это HTTP-акселератор, спроектированный исключительно для эффективного кеширования веб-контента. В отличие от универсальных веб-серверов, его архитектура оптимизирована для одной задачи: хранить готовые HTTP-ответы в оперативной памяти и отдавать их с минимально возможной задержкой. По сути, Varnish работает как посредник между пользователями и основным веб-сервером (Nginx или Apache), принимая весь входящий трафик и фильтруя его через свой кеширующий механизм.
При первом запросе на страницу запрос поступает в Varnish, который проверяет наличие готового ответа в своём кеше. Если кешированной версии нет, запрос передаётся на бэкенд-сервер (Nginx/Apache). Тот генерирует страницу, возвращает её Varnish, который сохраняет ответ в кеш и одновременно отправляет пользователю. При последующих запросах того же контента Varnish уже находит готовый ответ в оперативной памяти и отдаёт его напрямую, полностью минуя обращение к веб-серверу. Это позволяет обрабатывать тысячи запросов в секунду без нагрузки на основные системы.
Преимущества Varnish становятся очевидны при работе под нагрузкой. Скорость отдачи контента измеряется наносекундами, так как данные поступают непосредственно из RAM, минуя дисковые операции и повторную генерацию страниц. В результате можно добиться сокращения нагрузки на бэкенд-серверы до 90 %, что критично для ресурсов с пиковым трафиком. Кроме того Varnish позволяет тонко настраивать правила кеширования для различных типов контента, обработки cookies и заголовков.
Установка и первичная настройка Varnish
Мы будем настраивать Varnish на сервере под управлением Ubuntu 24.04, и все инструкции даны для этой ОС. Также предполагается, что веб-сервер (Nginx или Apache) уже установлен. Все операции требуют прав суперпользователя, поэтому будут выполняться через sudo.
Первым шагом установите сам Varnish из стандартных репозиториев Ubuntu:
sudo apt update
sudo apt install varnish
Теперь нужно перенастроить веб-сервер, чтобы он работал не на прямом порту 80, а на внутреннем порту, который будет проксироваться через Varnish. Для Nginx откройте конфигурационный файл:
sudo nano /etc/nginx/sites-enabled/default
Найдите строку с указанием порта listen 80 и измените её, например, на listen 127.0.0.1:8080. Для Apache нужный параметр находится в файле портов и файлах виртуальных хостов:
sudo nano /etc/apache2/ports.conf
Измените директиву Listen 80 на Listen 127.0.0.1:8080. После внесения изменений перезапустите веб-сервер соответствующей командой:
sudo systemctl restart nginx # или apache2
Теперь настройте Varnish на работу с бэкендом. Основной файл конфигурации находится по пути /etc/varnish/default.vcl. Откройте его:
sudo nano /etc/varnish/default.vcl
Убедитесь, что конфигурация указывает на правильный адрес и порт веб-сервера. Бэкенд должен выглядеть следующим образом:
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "8080";
}
Следующим шагом настройте systemd для запуска Varnish на стандартном веб-порту 80. Создайте drop-in файл для переопределения отдельных опций:
sudo mkdir -p /etc/systemd/system/varnish.service.d/
sudo nano /etc/systemd/system/varnish.service.d/custom.conf
И добавьте в него:
[Service]
ExecStart=
ExecStart=/usr/sbin/varnishd -a :80 -f /etc/varnish/default.vcl
После сохранения изменений перезапустите демон Varnish для применения новой конфигурации:
sudo systemctl daemon-reload
sudo systemctl restart varnish
Для проверки работоспособности выполните несколько тестов. Сначала проверьте статус службы:
sudo systemctl status varnish
Затем протестируйте работу через curl:
curl -I http://localhost
Если в выводе команды вы видите заголовок X-Varnish с числовым значением — это означает, что запрос успешно прошёл через кеширующий прокси. Для более детальной проверки можно посмотреть статистику кеширования:
varnishstat
Эта команда покажет статистику попаданий в кеш и промахов, что поможет оценить эффективность работы Varnish.
Финальная настройка и мониторинг
После базовой настройки оптимизируйте работу Varnish под конкретную конфигурацию сервера. По умолчанию Varnish выделяет под кеш 256 МБ оперативной памяти, что может быть недостаточно для большинства проектов. Чтобы увеличить это значение, отредактируйте параметры запуска сервиса. Откройте созданный на предыдущем этапе конфигурационный файл systemd:
sudo nano /etc/systemd/system/varnish.service.d/custom.conf
Отредактируйте, добавив параметры для увеличения кеша:
[Service]
ExecStart=
ExecStart=/usr/sbin/varnishd -a :80 -s malloc,2G -f /etc/varnish/default.vcl
В этом примере мы увеличиваем размер кеша до 2 ГБ, указав параметр -s malloc,2G. После внесения изменений примените новую конфигурацию:
sudo systemctl daemon-reload
sudo systemctl restart varnish
Чтобы проверить эффективность кеширования, используйте утилиту varnishstat, которая отображает статистику в реальном времени. Запустите её без параметров для просмотра всех метрик или с ключом -1 для однократного вывода:
varnishstat -1 | grep -E "(cache_hit|cache_miss)"
Ключевые метрики для анализа:
- cache_hit — количество запросов, обслуженных из кеша;
- cache_miss — количество запросов, потребовавших обращения к бэкенд-серверу;
- cache_hit_ratio — процент попаданий в кеш от общего числа запросов.
Для детального анализа отдельных запросов предназначена утилита varnishlog. Она показывает полную информацию о прохождении каждого запроса через систему, включая заголовки, время обработки и решение о кешировании:
varnishlog -g request -q "ReqUrl eq '/'"
Эта команда выведет логи только для запросов к корневой странице сайта, что полезно для отладки конкретных сценариев.
Важно понимать, что при перезагрузке сервера всё содержимое кеша очищается. Для принудительной очистки кеша без перезагрузки используется команда:
sudo varnishadm ban "req.url ~ /"
Она устанавливает бан-правило, которое немедленно удаляет из кеша все объекты, URL которых соответствует регулярному выражению. Для более тонкого управления можно использовать различные условия, например, очистку только определённой категории страниц:
sudo varnishadm ban "req.url ~ '/articles/'"
Читайте в блоге:
- Установка и настройка LAMP-сервера на Ubuntu 24.04 LTS
- Лучшие инструменты мониторинга сервера на Ubuntu 24.04: Netdata, Glances, htop
- Как настроить автоматические обновления безопасности в Ubuntu 24.04 с помощью unattended-upgrades