zaLinux.ru

Установка и настройка Varnish: ч. 1: как установить Varnish в Debian и Ubuntu


Оглавление

1. Как установить Varnish в Debian и Ubuntu

1.1 Как работает кэширование Varnish для Apache

1.2 Правильная настройка портов для Varnish и Apache

1.3 Установка Varnish

1.4 Настройка Apache на работу с Varnish

1.5 Настройка Varnish для работы с Apache и Hitch

1.6 Проверка Varnish и Apache

1.7 Настройка Hitch для работы с Varnish

1.8 Ошибка «ERR_TOO_MANY_REDIRECTS»

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

1.10 Как проверить скорость кэша Varnish

1.11 Обновление SSL сертификата при использовании Varnish и Hitch

1.12 Varnish без настройки бесполезен

2. Как настроить Varnish, примеры правил

3. Вспомогательные программы Varnish

4. Модули Varnish


Как работает кэширование Varnish для Apache

Для понимания сути кэширования веб-сервера нужно вспомнить, как работает веб-сайт:

  1. Поступает запрос от пользователя на показ определённой страницы
  2. С диска считываются файлы шаблонов и файлы с исходным кодом
  3. Из базы данных извлекается необходимая информация
  4. Выполняет обработка информации из базы данных
  5. Формируется страница, которая отправляется пользователю

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

И так каждый раз — для каждого запроса пользователя страница собирается заново.

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


  1. Страница из кэша показывается пользователю

Сама цепочка действий намного короче, плюс исключены такие медленные операции как чтение данных с диска, поскольку кэш хранится в оперативной памяти.

Это непосредственно подводит нас к преимуществам и тому, почему вам следует использовать Varnish Cache.

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

Его можно настроить для работы в паре с веб-сервером для более быстрого обслуживания страниц, что ускорит загрузку веб-сайтов. Он поддерживает балансировку нагрузки с проверкой работоспособности серверных ВМ, перезаписью URL, плавной обработкой «мёртвых» серверных ВМ и предлагает частичную поддержку ESI (включая Edge Side).

В этой статье мы объясним, как установить и настроить Varnish Cache 6.* в качестве внешнего интерфейса для HTTP-сервера Apache в системах Debian и Ubuntu.

Преимущества пользования Varnish:

  • Varnish Cache повышает скорость вашего веб-сайта с богатым содержанием.
  • Быстрая скорость загрузки помогает улучшить взаимодействие с пользователем и удержать клиентов.
  • Ваш веб-сервер может эффективно обрабатывать трафик веб-сайта с повышенной и бесперебойной производительностью.
  • В случае сбоя сервера ваш сайт по-прежнему будет работать, доставляя кешированный контент.
  • Вам больше не нужно время от времени обновлять существующий пакет хостинга, так как он может поддерживать высокий трафик. Это, в свою очередь, делает ваш сайт масштабируемым.
  • Высокая скорость веб-сайта повышает вероятность того, что ваш веб-сайт попадёт в поисковые системы и будет виден в поисковой выдаче.
  • Varnish также уменьшает количество необходимых серверов.

Varnish также работает как маршрутизатор HTTP-запросов, брандмауэр веб-приложений, балансировщик нагрузки и многое другое. Он настраивается с использованием гибкого языка конфигурации Varnish (VCL), который расширяется с помощью модулей Varnish (также известных как VMOD), поддерживает Edge Side Includes (ESL), сжатие и декомпрессию Gzip и многое другое.

Итак, эта серия инструкций расскажет, как установить Varnish — кэширование для Apache в Debian и Ubuntu, давайте приступим! Если у вас Arch Linux или основанный на нём дистрибутив, то смотрите статью Как установить Varnish в Arch Linux.

Правильная настройка портов для Varnish и Apache

По умолчанию Apache в большинстве случаев прослушивает 80 и 443 порты. При использовании кэширования, запросы на эти порты должен принимать Varnish. То есть нам не только нужно установить и настроить Varnish, но и настроить Apache на работу с ним.

Ещё в Varnish Cache отсутствует встроенная поддержка SSL/TLS и других протоколов, связанных с портом 443. Если вы используете Varnish Cache для повышения производительности своего веб-приложения, вам необходимо установить и настроить другое программное обеспечение, называемое прокси-сервером завершения SSL/TLS (SSL/TLS termination proxy), для работы вместе с Varnish Cache для включения HTTPS. Для этого мы будем использовать Hitch.


Итак, логическая схема работы следующая:

То есть мы настроим:

  • Apache на прослушивание порта 8080
  • Varnish на прослушивание порта 80 (для принятия входящий соединений от посетителей сайта) и на прослушивание порта 8443 (для принятия входящий соединений от Hitch), а также на отправку всех полученных запросов на порт 8080 для Apache (если запрошенной страницы нет в кэше)
  • Hitch на прослушивание порта 443, а также отправку полученных запросов на порт 8443 для Varnish, который отправит их на порт 8080 для Apache (если запрошенной страницы нет в кэше)

Выглядит запутанно? Не переживайте, на самом деле установка выполняется достаточно просто и показана далее в деталях.

Установка Varnish

У вас уже должен быть установлен веб-сервер:

Вы можете установить Varnish как на сервер с уже работающем сайтом, так и в качестве свежей установки.

В настоящее время Varnish Cache присутствует в стандартных репозиториях, поэтому достаточно выполнить команду (мы сразу устанавливаем и Hitch, который в любом случае нам понадобится):

apt install varnish hitch

Эта и практические все последующие команды требуют прав root. Поэтому выполните вход как пользователь root, либо используйте эти команды с sudo

Чтобы убедиться, что установка прошла нормально, выполните следующую команду, которая покажет версию:

varnishd -V

Настройка Apache на работу с Varnish

У Apache в Debian настройки портов вынесены в отдельный файл /etc/apache2/ports.conf.

Откройте этот файл

vim /etc/apache2/ports.conf

Закомментируйте строки, в которых установлены порты для прослушивания:

#Listen 80

<IfModule ssl_module>
#	Listen 443
</IfModule>

<IfModule mod_gnutls.c>
#	Listen 443
</IfModule>

И добавьте строку:

Listen 8080

Обычно для каждого сайта имеется две настройки хостов: HTTP и HTTPS. С помощью команды a2dissite отключите все хосты с HTTPS. Дело в том, что Apache не будет обрабатывать HTTPS запросы и необходимо освободить порт 443.

Для справки: если вы отключили неверный хост, вы можете включить его обратно с помощью команды a2ensite.

Список включённых хостов вы можете просмотреть в папке /etc/apache2/sites-enabled:

ls -l /etc/apache2/sites-enabled

К примеру, чтобы отключить хост, чьи настройки хранятся в файле default-ssl.conf:

a2dissite default-ssl.conf

Вы можете как указывать полное имя файла (например, default-ssl.conf), так и без расширения (например, default-ssl).

Итак, HTTPS хосты отключаем вовсе, а HTTP хосты необходимо отредактировать.


К примеру, содержимое моего конфигурационного файла /etc/apache2/sites-enabled/000-default.conf следующее:

<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/html

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Открываем его:

vim /etc/apache2/sites-enabled/000-default.conf

И редактируем порт для директивы VirtualHost:

<VirtualHost *:8080>

	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/html

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Обратите внимание, что если вы оставите звёздочку, то будут приниматься подключения с любых адресов. То есть при желании можно подключиться к вашему сайту минуя систему хеширования, указав порт 8080. Но вы можете сделать так, чтобы Apache прослушивал только loop интерфейс — этого достаточно, т. к. запросы от программы кэширования будут приходить через локальный интерфейс:

<VirtualHost 127.0.0.1:8080>

Настройка Varnish для работы с Apache и Hitch

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


systemctl edit --full varnish

Будет открыто окно редактора. В Debian таким редактором по умолчанию является joe, поэтому рекомендуется ознакомиться со статьёй «Основы использования Joe’s Own Editor».

Если вы поленились прочитать статью по ссылке выше, то после внесения изменений для завершения работы редактора нажмите Ctrl+K, а затем клавишу Q. Эта команда означает закрыть редактор, а если в файле были сделаны изменения, то вам будет предложено сохранить их. Если изменений не было, то редактор просто закроется.

Нас интересует строка:

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

Её необходимо заменить на строку:

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

То есть мы убрали опцию -a :6081 (прослушивать порт 6081) и добавили опции -a :80 -a 127.0.0.1:8443,proxy для прослушивания соответствующих портов. Вы также можете отредактировать «-s malloc,256m» - это значение устанавливает, сколько мегабайт оперативной памяти будет выделено для хранения кэша, по умолчанию это 256 мегабайт.

Проверьте содержимое файла /etc/varnish/default.vcl:

cat /etc/varnish/default.vcl

По умолчанию он преимущественно состоит из комментариев, но там обязательно должны быть активны строки:

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

Если их нет, то добавьте.

Проверка Varnish и Apache

Мы уже настроили прослушивание порта 80 и отправку запросов веб-серверу Apache — мы можем проверить совместную работу Varnish и Apache. Но помните, что мы ещё не настроили прослушивание порта 443 (HTTPS), поэтому если вы хотите выполнить проверку прямо сейчас, то вам может понадобится отключить перенаправление на HTTPS в файле .htaccess. Либо вы можете настроить Hitch и только затем выполнить проверки.

Итак, если вы хотите сделать проверку прямо сейчас, то выполните:

systemctl daemon-reload

Перезагрузите конфигурацию веб-сервера:

systemctl reload apache2

Убедитесь, что всё в порядке с Apache:

systemctl status apache2

Запустите Varnish:

systemctl restart varnish

Убедитесь, что всё в порядке с Varnish и добавьте в автозагрузку:

systemctl status varnish
systemctl enable varnish

Теперь вы можете подключиться к своему сайту по протоколу HTTP.

Вы можете проверить открытые порты командой:

ss -tpln

Служба varnishd должна прослушивать 80 порт, а служба apache2 должна прослушивать 8080 порт.

Настройка Hitch для работы с Varnish

Hitch — это прокси, который поддерживает HTTPS. Именно Hitch будет принимать входящие соединения на 443 порт и отправлять их в Varnish, которая, в свою очередь, будет отправлять их в Apache.

Копируем файл конфигурации:

cp /usr/share/doc/hitch/examples/hitch.conf.example /etc/hitch/hitch.conf

Открываем его для редактирования:

vim /etc/hitch/hitch.conf

Отредактируйте его следующим образом:

# Run 'man hitch.conf' for a description of all options.


Frontend = { # оставляем как есть
    host = "*"
    port = "443"
}
backend = "[127.0.0.1]:8443"    # меняем порт 6086 на 8443, поскольку в качестве порта Varnish PROXY port мы установили именно его.
workers = 1                     # установите на количество ядер CPU

daemon = off # ОБЯЗАТЕЛЬНО МЕНЯЕМ, иначе не заработает https://bugzilla.redhat.com/show_bug.cgi?id=1467839

# Как и в предыдущей опции, здесь ошибка, из-за которой Hitch не загрузится
# правильным именем и группой является _hitch, который указан в команде запуска,
# поэтому строки ниже можно закомментировать или удалить.
#user = "hitch"
#group = "hitch"

# Enable to let clients negotiate HTTP/2 with ALPN. (default off)
# alpn-protos = "h2, http/1.1"

# run Varnish as backend over PROXY; varnishd -a :80 -a localhost:6086,PROXY ..
write-proxy-v2 = on             # Write PROXY header

# Обязательно укажите пути до сертификата и приватного ключа,
# у вас путь до этих файлов другой
pem-file = {
	cert = "/etc/ssl/certs/w-e-b.site.server.crt"
	private-key = "/etc/ssl/private/w-e-b.site.server.key"
}

В hitch грубые ошибки, которые препятствуют запуску службы: опции в конфигурационном файле и в команде запуска противоречат друг-другу до полной невозможности запустить с помощью systemctl. Эти ошибки указаны в комментариях к конфигурационному файлу и исправлены в приведённых настройках.

Обратите внимание на директиву:

pem-file = {
	cert = "/etc/ssl/certs/w-e-b.site.server.crt"
	private-key = "/etc/ssl/private/w-e-b.site.server.key"
}

Для Hitch можно указать путь до сертификата и ключа несколькими способами, но мне больше всего нравится способ, когда эти два файла разделены. Дело в том, что в таком же виде используются сертификат и ключ веб-сервером. То есть не нужно создавать новый файл, достаточно указать пути до уже имеющихся. Это особенно актуально если у вас настроено автоматическое получение бесплатных SSL сертификатов — там ничего менять не нужно.

Опцию pem-file в конфигурационном файле можно использовать много раз — столько сколько у вас сайтов.

Если вы ещё не запустили Varnish, то сделайте это сейчас. Начните с перезагрузки конфигурации менеджера systemd:

systemctl daemon-reload

Перезагрузите конфигурацию веб-сервера:

systemctl reload apache2

Убедитесь, что всё в порядке с Apache:

systemctl status apache2

Запустите Varnish:

systemctl restart varnish

Убедитесь, что всё в порядке с Varnish и добавьте в автозагрузку:

systemctl status varnish
systemctl enable varnish

Запустите и добавьте службу hitch в автозагрузку:

systemctl enable --now hitch

Проверьте её статус:

systemctl status hitch

Теперь вы можете проверить работу своего сайта.

Ошибка «ERR_TOO_MANY_REDIRECTS»

Если вы столкнулись с ошибкой

ERR_TOO_MANY_REDIRECTS

её причина скорее всего в том, что в файле .htaccess настроена переадресация на протокол HTTPS. Apache принимает входящее соединение по протоколу HTTP и делает редирект на HTTPS. Этот запрос принимает Hitch и уже в виде HTTP отправляет на Varnish, которая отправляет на Apache. То есть Apache вновь принимает входящее соединение по протоколу HTTP и делает редирект на HTTPS. И так повторяется бесконечно.

Чтобы этого избежать, отключите в файле .htaccess редирект. Этот файл может располагаться по пути /var/www/html/.htaccess.

Строки, отвечающие за редирект, могут быть примерно такими:

RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} !^/.well-known/
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}

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

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

curl -I URL

Например:

curl -I https://w-e-b.site/

О том, что ответ отправлен системой кэширования говорят заголовки:

X-Varnish: 495344 199688
Age: 17
Via: 1.1 varnish (Varnish/6.4)

Кстати, заголовок Age означает возраст данных в кэше, измеряемых в секундах. То есть присланные данные хранятся в кэше уже 17 секунд, их возраст 17 секунд.

Как проверить скорость кэша Varnish

С помощью команды вида:

time curl -s АДРЕС > /dev/null

Можно проверить скорость получения данных.

К примеру, два раза подряд запущу следующую команду — получится, что в первый раз данные будут присланы от Apache, который предварительно составит список IP адресов получив их из базы данных, а второй раз данные будут присланы из кэша:

time curl -s 'https://w-e-b.site/?act=all-country-ip&city=Pattaya' > /dev/null

В первый раз команда заняла 1,758 секунды, а во второй потребовалось 0,817 секунды. То есть скорость получения данных увеличилась для рассматриваемого сервиса в 2 раза. На других сайтах разница может быть не такой значительной, но чем дольше времени необходимо для генерации страницы и чем загруженнее сервер, тем больше будет заметно ускорение.

Обновление SSL сертификата при использовании Varnish и Hitch

Помните, что теперь за работу с HTTPS отвечает Hitch. Поэтому при обновлении сертификатов вместо перезапуска Apache необходимо перезагрузить Hitch:

systemctl reload hitch.service

Varnish без настройки бесполезен

Установленный вами Varnish практически бесполезен. От Varnish (как, например, и от файервола) без дополнительной настройки мало пользы. К примеру, по умолчанию время хранения кэша составляет всего 2 минуты и хеш не сохраняется если присланы кукиз даже для сайтов, которые кукиз не используют (эти кукиз могут устанавливаться счётчиками и блоками рекламы). Также много других нюансов.

Поэтому обязательно читайте вторую часть, полностью посвящённую настройке Varnish.

Кстати, если вам нужен недорогой, но производительный VPS сервер, то вы найдёте отличное предложение по этой ссылке.


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *