И малым тварям удаются великие творения (Станислав Ежи Лец).
Как использовать Varnish для повышения производительности HTTP
Главное меню » Ubuntu » Как использовать Varnish для повышения производительности HTTP
01.07.2024
В сегодняшнем быстро меняющемся цифровом ландшафте производительность веб-приложений является ключом к обеспечению бесперебойного взаимодействия с пользователем. Пользователи ожидают быстрой загрузки веб-страниц и быстрого взаимодействия. Любые задержки или неповоротливость могут привести к разочарованию, увеличению показателей отказов, потере продаж и подмоченной репутации.
Чтобы убедиться, что ваше веб-приложение соответствует этим ожиданиям, вы можете использовать технологии оптимизации для повышения производительности. Введите Varnish – надежный HTTP-ускоритель, который может революционизировать скорость и эффективность вашего веб-приложения.
В этой статье мы рассмотрим мощь и потенциал Varnish, расскажем о его ключевых функциях, преимуществах и вариантах использования. Мы поделимся точными шагами по установке, настройке и оптимизации для достижения максимальной производительности. Кроме того, мы рассмотрим соображения безопасности и представим некоторые инструменты мониторинга, чтобы гарантировать, что Varnish остается надежным и эффективным.
Что такое Varnish?
Varnish — это обратный прокси, который ускоряет работу веб-сайтов за счет кэширования содержимого HTTP. В типичной архитектуре Varnish действует как посредник между клиентами и веб-серверами. Он хранит и обслуживает часто используемые веб-ресурсы из своей локальной памяти, что приводит к снижению нагрузки на сервер и ускорению времени отклика.
Varnish имеет открытый исходный код и доступен для различных операционных систем, включая основные дистрибутивы Linux, macOS и Windows. Вот некоторые из его ключевых особенностей::
Varnish легко настраивается. Он предлагает язык для конкретного домена (DSL), известный как Varnish Configuration Language (VCL). Используя код VCL, вы можете реализовать пользовательскую маршрутизацию, изменять запросы и реализовать пул соединений.
Varnish предоставляет надежный набор функций кэширования, включая аннулирование кэша, определение некэшируемого содержимого и встроенное сжатие.
Varnish легко расширяется. Вы можете использовать встроенный код C для расширения вашей установки Varnish. (Примечание: используйте эту функцию, только если у вас есть опыт разработки на C. Встроенный код C компилируется в Varnish, и любые ошибки в коде могут привести к сбою Varnish.)
Varnish поддерживает Edge Side Includes (ESI), что позволяет создавать веб-страницы путем объединения различных фрагментов. ESI может значительно повысить частоту посещений и общую производительность.
Почему вы должны использовать Varnish?
В дополнение к очевидным преимуществам повышения производительности и быстродействия, вот несколько других причин, по которым вам следует использовать Varnish:
Масштабируемость: Varnish поддерживает несколько серверных частей. Используя VCL, вы можете реализовать эффективную логику балансировки нагрузки для повышения масштабируемости и доступности.
Экономия средств: снижая нагрузку на сервер и увеличивая общую пропускную способность, Varnish помогает максимально эффективно использовать ресурсы. Это может сэкономить затраты за счет уменьшения потребности в дополнительных серверах или пропускной способности.
Безопасность: Действуя в качестве обратного прокси-сервера, Varnish защищает ваши веб-серверы от прямого доступа к Интернету, уменьшая вероятность атаки.
Рабочий процесс Varnish
Чтобы понять, как работает Varnish, давайте рассмотрим его рабочий процесс:
Клиент отправляет HTTP-запрос для доступа к веб-ресурсу.
Varnish перехватывает запрос до того, как он достигнет веб-сервера.
Varnish проверяет, присутствует ли запрошенное содержимое в его локальной памяти. Если оно присутствует, оно передается непосредственно клиенту, сохраняя обратную передачу на веб-сервер. Если он отсутствует, Varnish перенаправляет запрос на веб-сервер.
Веб-сервер генерирует и отправляет ответ Varnish.
Varnish передает ответ клиенту. В зависимости от настроенной стратегии кэширования, Varnish может кэшировать или не кэшировать ответ для последующих запросов.
Важность оптимизации HTTP
Оптимизация HTTP включает в себя набор методов, которые могут быть использованы для повышения производительности веб-сайта. Примеры стратегий оптимизации включают кэширование, уменьшение размера изображений, минимизацию CSS и использование сети доставки контента (CDN).
Факторы, влияющие на производительность HTTP
При оптимизации производительности HTTP вашего веб-сайта важно учитывать следующие факторы:
Задержка в сети: время, необходимое для прохождения запроса от клиента к серверу и обратно. На задержку в сети могут влиять такие факторы, как географическое расстояние, загруженность сети и качество соединения.
Время отклика сервера: время, затрачиваемое сервером на обработку запроса и генерацию ответа. На время отклика могут влиять такие факторы, как загрузка сервера, запросы к базе данных и качество кода.
Размер и сложность файла: размер и сложность веб-ресурсов, включая HTML, CSS, JavaScript и мультимедийные файлы. Большие файлы или сложные структуры кода требуют больше времени для загрузки и обработки, что приводит к более медленной загрузке страниц.
Политики кэширования: Конфигурация и политики кэширования оказывают значительное влияние на производительность HTTP. Эффективное кэширование снижает частоту запросов к серверу за счет прямого обслуживания кэшированного содержимого. И наоборот, неправильная политика кэширования может привести к устареванию содержимого или ненужным запросам, что негативно скажется на производительности.
Ограничения пропускной способности: Ограниченная пропускная способность, особенно в мобильных или низкоскоростных сетевых средах, может существенно повлиять на производительность HTTP. Такие факторы, как большие файлы, большой объем запросов и отсутствие методов оптимизации, могут привести к высокому использованию полосы пропускания.
Давайте рассмотрим несколько причин, по которым оптимизация HTTP имеет решающее значение для успеха в Интернете:
Современный пользователь постоянно подвергается бомбардировке информацией. Если веб-сайт не загружается в первые несколько секунд, пользователь, скорее всего, покинет его.
Поисковые системы, включая Google, учитывают время загрузки страницы при ранжировании веб-сайтов. Веб-сайт с более быстрой загрузкой занимает более высокое место в результатах поиска.
Такие методы, как кэширование, сжатие и точная настройка конфигурации, могут уменьшить размер передаваемых данных, что приводит к снижению использования полосы пропускания.
Оптимизированный веб-сервер помогает мобильным пользователям работать быстрее и отзывчивее.
Установка и настройка Varnish
В этом разделе мы поделимся шагами по началу работы с Varnish на сервере Ubuntu. Давайте начнем.
Установка Varnish в Ubuntu
Список доступных пакетов Varnish доступен на веб-сайте Packagecloud. На момент написания статьи последней стабильной версией Varnish является 7.3.0. Согласно официальному веб-сайту Varnish, поддерживаются только три версии: 7.3.0, 7.2.1 и 6.0.11, поскольку срок действия всех остальных версий истек. В зависимости от ваших конкретных требований выберите версию Varnish для установки. Мы рекомендуем установить 7.3.0.
Выполните следующую команду, чтобы получить информацию обо всех последних доступных пакетах:
sudo apt-get update
Чтобы получить правильный пакет Varnish для установки, мы должны настроить репозиторий, содержащий пакет. Но сначала запустите эту команду для установки всех зависимостей, мы должны настроить репозиторий пакетов Varnish:
Наконец, выполните эти команды для настройки репозитория пакетов Varnish:
. /etc/os-release
sudo tee /etc/apt/sources.list.d/varnishcache_varnish60lts.list > /dev/null <<-EOF
deb https://packagecloud.io/varnishcache/varnish60lts/$ID/ $VERSION_CODENAME main
EOF
sudo tee /etc/apt/preferences.d/varnishcache > /dev/null <<-EOF
Package: varnish varnish-*
Pin: release o=packagecloud.io/varnishcache/*
Pin-Priority: 1000
EOF
Снова запустите команду update, чтобы также была получена информация о недавно настроенном репозитории.
sudo apt-get update
Наконец, выполните эту команду для установки последней (7.3.0) версии Varnish
sudo apt-get install varnish
Настройка Varnish в Ubuntu
Теперь, когда Varnish установлен в нашей системе, мы выполним несколько шагов по его настройке.
Шаг № 1 – Настройка systemd
Файл конфигурации systemd для Varnish находится по адресу: /lib/systemd/system/varnish.service Вы можете изменить настройки в этом файле в соответствии с вашими потребностями. Для этого выполните следующую команду, которая откроет файл в редакторе по умолчанию:
sudo systemctl edit --full varnish
Например, если вы хотите увеличить максимальное количество открытых файловых дескрипторов для Varnish, вы можете изменить параметр LimitNOFILE в файле, который по умолчанию равен 131072. Вы также можете установить максимальный размер основного файла, используя параметр LimitCORE, который по умолчанию равен бесконечности.
Инструкция ExecStart в файле включает различные параметры командной строки, передаваемые процессу varnishd при запуске. Вы можете передать желаемый порт, размер кэша и любые другие параметры в Varnish, изменив эту команду. Например, мы изменили порт на 80 и установили размер кэша на 5 гигабайт. Команда ExecStart обновлена до:
ExecStart=/usr/sbin/varnishd \
-a :80 \
-a www.site24x7.com,PROXY \
-p feature=+http2 \
-f /etc/varnish/default.vcl \
-s malloc,5g
После внесения всех изменений в файл сохраните его и выполните следующую команду:
sudo systemctl daemon-reload
Шаг # 2 – Настройка Apache для работы с Varnish
Следующим шагом будет настройка вашего веб-сервера для работы с Varnish. В этой статье мы будем использовать Apache, но вы можете настроить любой сервер, использующий HTTP.
Отредактируйте файл конфигурации /etc/apache2/ports.conf и измените порт прослушивания с 80 на 8080. (Вы можете использовать другой порт в зависимости от ваших предпочтений)
Кроме того, замените <VirtualHost *:80> на <VirtualHost *:8080> во всех файлах виртуального хостинга. (Вы можете использовать другой порт в зависимости от ваших предпочтений)
Шаг # 3 – Настройка серверных систем с использованием VCL
Файл VCL по умолчанию находится по адресу /etc/varnish/default.vcl. Спецификация серверной части по умолчанию в файле использует IP 127.0.0.1 и порт 8080.
Если на последнем шаге вы выбрали другой порт, укажите это здесь. Вы также можете добавить дополнительные серверные части в свои настройки Varnish, используя тот же синтаксис.
Приведенная выше команда настроит другой сервер для нашего веб-приложения на основе Python.
Шаг # 4 – Перезапуск Apache и Varnish
Наконец, мы готовы перезапустить Apache и Varnish, чтобы можно было применить все изменения. Выполните следующую команду:
sudo systemctl restart apache2 varnish
Получение максимальной отдачи от Varnish
В отличие от большинства систем, Varnish не использует директивы конфигурации, а вместо этого полагается на VCL для настройки. Хотите ли вы реализовать список контроля доступа, добавить проверки работоспособности, использовать хеширование для кэшированных данных или обслуживать контент на основе устройства пользователя, вы можете добиться этого с помощью VCL. Давайте рассмотрим несколько советов и хитростей по оптимизации конфигурации Varnish.
Настройка правил кэширования на основе шаблонов URL и заголовков
Определяя определенные правила в VCL, вы можете управлять тем, какой контент следует кэшировать и на какой срок. Один из подходов заключается в создании правил кэширования на основе шаблонов URL. Varnish позволяет сопоставлять URL-адреса с помощью регулярных выражений и соответствующим образом применять определенные директивы кэширования. Давайте рассмотрим пример:
sub vcl_recv {
# Сопоставляйте URL-адреса, начинающиеся с "/articles/".
if (req.url ~ "^/articles/") {
# Установите более длительное время работы кэша (TTL) для статей
set beresp.ttl = 1h;
}
# Сопоставляйте URL-адреса, заканчивающиеся на ".css" или ".js".
if (req.url ~ "\.(css|js)$") {
# Кэшируйте эти статические ресурсы на более длительный срок
set beresp.ttl = 7d;
}
}
В приведенном выше фрагменте кода мы устанавливаем более длинный TTL для статей на нашем веб-сайте, поскольку они обновляются реже. Мы также кэшируем статические ресурсы на более длительный срок.
Аналогичным образом вы также можете настроить правила кэширования на основе конкретных заголовков запросов или ответов. Вот пример:
sub vcl_backend_response {
# Кэшируйте ответы с определенным значением заголовка
if (beresp.http.X-Cacheable == "true") {
# Установите пользовательский TTL кэша для кэшируемых ответов
set beresp.ttl = 1h;
}
}
В приведенном выше фрагменте мы обновляем TTL результата кэша, если ответ содержит определенный заголовок.
Настройка стратегий недействительности кэша
Важно иметь стратегию аннулирования кэша, чтобы гарантировать, что пользователи никогда не получат устаревший контент. Varnish поддерживает три различные стратегии аннулирования кэша.:
Очистка HTTP: Этот метод включает удаление объекта из кэша. Пример:
sub vcl_recv {
if (req.method == "PURGE") {
if (client.ip !~ purge_acl) {
return(synth(403, "Forbidden"));
}
# Извлеките URL-адрес, подлежащий удалению
set req.http.X-Purge-URL = regsub(req.url, "^[^:]*:[/]{2}", "");
return (purge);
}
}
В приведенном выше фрагменте кода мы сначала проверяем, является ли метод запроса PURGE , затем проверяем, является ли IP-адрес клиента частью списка ACL purge, затем извлекаем URL-адрес с помощью регулярного выражения и, наконец, удаляем URL-адрес из кэша.
Запреты: Еще один способ принудительного аннулирования кэша — запретить кеширование определенного контента. Например:
sub vcl_backend_response {
# Добавьте теги кэша к заголовкам ответов
set beresp.http.Cache-Tags = "category-123";
}
sub vcl_recv {
# Аннулирует кэш, если в запросе присутствуют определенные теги кэша
if (req.http.Cache-Tags ~ "category-123") {
# Remove the associated content from the cache
ban("obj.http.Cache-Tags ~ category-123");
}
}
В приведенном выше фрагменте кода мы вводим запрет, когда определенный тег является частью заголовков ответа.
Принудительный сбой кэша: Чтобы гарантировать, что Varnish никогда не кэширует объект, вы можете использовать параметр req.hash_always_miss .
sub vcl_recv {
# Обход кэша для запросов с определенным параметром запроса
if (req.url ~ "^/api" && req.url ~ "refresh=true") {
set req.hash_always_miss = true;
return (hash);
}
}
В приведенном выше фрагменте кода мы установили для req.hash_always_miss значение true для всех запросов API, для определенного параметра запроса которого установлено значение true.
Настройка Varnish для еще большей производительности
Несколько параметров в Varnish можно настроить для оптимизации производительности в зависимости от ваших конкретных потребностей. Вот несколько примеров.:
thread_pools: Varnish поддерживает несколько пулов потоков, что может быть полезно в сценариях с высоким трафиком или несколькими серверными системами. Настраивая отдельные пулы потоков для различных целей, таких как обработка клиентских подключений, вы можете точно настроить производительность и пропускную способность.
backend_idle_timeout: задает время ожидания для неиспользуемых внутренних подключений. Установка соответствующего значения помогает своевременно закрывать ненужные подключения, предотвращая ненужную трату ресурсов.
gzip_level: позволяет сжимать HTTP-ответы с помощью gzip. Настройка уровня сжатия (по умолчанию: 6, минимум: 0, максимум: 9) уравновешивает компромисс между уменьшением размера и загрузкой процессора.
http_resp_hdr_len и http_resp_size: Эти параметры определяют максимальную длину и размер заголовков и тела HTTP-ответа соответственно. Установка для них соответствующих значений гарантирует, что Varnish сможет эффективно обрабатывать ответы различного размера.
default_keep: Этот параметр представляет время по умолчанию, в течение которого Varnish будет хранить объект в кэше. Настройка соответствующего значения гарантирует, что бесполезные записи не будут храниться в кэше слишком долго.
Интеллектуальная маршрутизация между несколькими серверными системами
Если вы используете несколько серверных систем, вы можете использовать VCL для реализации логики маршрутизации запросов на основе таких факторов, как заголовки запросов, шаблоны URL-адресов или другие условия. Рассмотрим этот пример.:
sub vcl_recv {
if (req.http.User-Agent ~ "Mobile") {
# Перенаправлять мобильных пользователей на определенный внутренний сервер
set req.backend_hint = mobile_backend;
} else if (req.url ~ "^/auth/") {
# Перенаправляйте запросы на аутентификацию на выделенный внутренний сервер
set req.backend_hint = auth_backend;
} else {
# Перенаправляйте все остальные запросы на сервер по умолчанию
set req.backend_hint = default_backend;
}
}
В приведенном выше фрагменте кода мы перенаправляем запросы мобильных клиентов на выделенный мобильный серверный сервер, запросы аутентификации — на серверный сервер аутентификации, а все остальные запросы — на внутренний сервер по умолчанию.
Соображения о высокой доступности
Примите во внимание следующие рекомендации для обеспечения высокой доступности:
Балансировка нагрузки: распределите трафик между несколькими экземплярами Varnish.
Избыточность: разверните Varnish в резервной конфигурации для отработки отказа.
Мониторинг работоспособности: При определении внутренних серверов в VCL используйте ключевое слово probe для принудительной автоматической проверки работоспособности серверов.
Масштабируемость: масштабирование по горизонтали или вертикали для обработки увеличенной рабочей нагрузки.
Аварийное восстановление: реализация стратегий резервного копирования и восстановления при системных сбоях или потере данных.
Соображения безопасности при использовании Varnish
Varnish предлагает несколько средств контроля безопасности для защиты ваших веб-серверов от кибератак.
Настройка SSL / TLS: Через свой аддон Hitch Varnish поддерживает SSL / TLS для всех HTTP-коммуникаций. Чтобы предотвратить раскрытие конфиденциальных данных, включите SSL / TLS.
Включить аутентификацию интерфейса CLI: Безопасный доступ к интерфейсу CLI Varnish с помощью аутентификации по предварительному общему ключу (PSK). Это гарантирует, что только авторизованные лица могут выполнять операции с экземпляром Varnish.
Используйте списки управления доступом (ACL): Используйте VCL для определения списков управления доступом и используйте их для управления доступом к Varnish и вашим веб-серверам.
Очистка пользовательского контента: Используйте VCL для очистки пользовательского контента, удаления конфиденциальной информации или применения пользовательских средств контроля безопасности.
Ограничение скорости: Varnish позволяет ограничить количество запросов в секунду с IP-адреса или для определенных ресурсов. Ограничение скорости помогает предотвратить DDoS-атаки и чрезмерное потребление ресурсов.
Инструменты Varnish для мониторинга
Varnish поставляется в комплекте с различными инструментами для мониторинга и создания отчетов.
varnishtop используется для мониторинга и анализа трафика кэша Varnish в режиме реального времени, предоставляя информацию о наиболее часто запрашиваемых URL-адресах и IP-адресах клиентов.
varnishhist может использоваться для анализа тенденций времени отклика в кэше Varnish, помогая выявлять узкие места производительности и оптимизировать стратегии кэширования.
varnishstat используется для отображения статистики производительности, работоспособности и использования экземпляра в режиме реального времени.
varnishtest помогает в автоматическом тестировании и валидации конфигураций Varnish, обеспечивая надлежащую функциональность и производительность.
varnishncsa используется для отображения информации о HTTP-запросе в формате файла общего журнала NCSA.
Заключение
Varnish — это надежный HTTP-кэш, который играет ключевую роль в повышении производительности и масштабируемости веб-архитектур. Благодаря разнообразному набору функций, настраиваемой конфигурации VCL и встроенным функциям безопасности Varnish позволяет разработчикам оптимизировать свои приложения и защищать свои веб-серверы от потенциальных угроз.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.