Varnish Cache (также называемый Varnish) — это высокопроизводительный ускоритель HTTP сервера с открытым исходным кодом и современным дизайном. Он хранит кэш в памяти, гарантируя, что ресурсы веб-сервера не будут тратиться на создание одной и той же веб-страницы снова и снова по запросу клиента.
В целом Varnish Cache снижает нагрузку на сервер и увеличивает скорость работы сайта. Varnish Cache крайне полезен для виртуальных выделенных серверов (VDS) и для выделенных серверов.
Эта серия инструкций расскажет, как установить Varnish в Arch Linux и настроить кэширование для 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
У вас уже должен быть установлен веб-сервер: Установка LAMP (Linux, Apache, MySQL/MariaDB, PHP7 и phpMyAdmin) в Arch Linux / BlackArch
Varnish Cache присутствует в стандартных репозиториях, поэтому достаточно выполнить команду (мы сразу устанавливаем ещё и Hitch, который в любом случае нам понадобится):
pacman -S varnish hitch
Эта и практические все последующие команды требуют прав root. Поэтому выполните вход как пользователь root, либо используйте эти команды с sudo.
Чтобы убедиться, что установка прошла нормально, выполните следующую команду, которая покажет версию:
varnishd -V
Настройка Apache на работу с Varnish
Откройте файл настроек веб-сервера /etc/httpd/conf/httpd.conf:
vim /etc/httpd/conf/httpd.conf
Найдите и закомментируйте директиву Listen, чтобы получилось:
#Listen 80
Вместо неё добавьте строку:
Listen 8080
Если вы только установили веб-сервер и у вас не настроен HTTPS, то вам не нужно выполнять шаги по его отключению, поэтому пропустите следующие пункты, касающиеся HTTPS.
Если у вас уже настроен HTTPS, то отключите все опции, относящиеся к протоколу SSL, пример таких опций:
SSLProtocol all -SSLv2 -SSLv3 SSLHonorCipherOrder on SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"
Для их отключения удалите или закомментируйте эти строки.
Проверьте папку /etc/httpd/conf/mods-enabled/, в ней могут быть файлы с настройками HTTPS, например, /etc/httpd/conf/mods-enabled/ssl.conf.
Там могут быть строки с Listen:
Listen 443
Если это ссылка на реальный файл, то удалите её, если это реальный файл, то измените его расширение, чтобы отключить:
mv /etc/httpd/conf/mods-enabled/ssl.conf /etc/httpd/conf/mods-enabled/ssl.confssl.conf.back
Если вы устанавливали веб-сервер по инструкции на которую дана ссылка выше, то в ней мы создавали файлы a2dissite (для отключения виртуальных хостов) и a2ensite (для включения виртуальных хостов). Если у вас есть эти файлы, то используйте их, либо просто удалите символьные ссылки из директории /etc/httpd/conf/sites-enabled.
Обычно для каждого сайта имеется две настройки хостов: HTTP и HTTPS. С помощью команды a2dissite отключите все хосты с HTTPS. Дело в том, что Apache не будет обрабатывать HTTPS запросы и необходимо освободить порт 443.
Список включённых хостов вы можете просмотреть в папке /etc/httpd/conf/sites-enabled:
Примеры отключения хостов:
a2dissite wxmaxima.ru-ssl a2dissite suipbiz-ssl a2dissite softocracy.ru-ssl
Итак, HTTPS хосты отключаем вовсе, а HTTP хосты необходимо отредактировать.
К примеру, содержимое моего конфигурационного файла /etc/httpd/conf/sites-enabled/suipbiz.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/httpd/conf/sites-enabled/suipbiz.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>
В одном конфигурационном файле директива VirtualHost может встречаться несколько раз, например, для виртуального хоста suip.biz и другого виртуального хоста www.suip.biz — отредактируйте значения портов для них всех.
Обратите внимание, что если вы оставите звёздочку, то будут приниматься подключения с любых адресов. То есть при желании можно подключиться к вашему сайту минуя систему хеширования, указав порт 8080. Но вы можете сделать так, чтобы Apache прослушивал только loop интерфейс — этого достаточно, т. к. запросы от программы кэширования будут приходить через локальный интерфейс:
<VirtualHost 127.0.0.1:8080>
Настройка Varnish для работы с Apache и Hitch
Необходимо отредактировать команду, который запускается служба Varnish, для этого выполните:
systemctl edit --full varnish
Нас интересует строка:
ExecStart=/usr/sbin/varnishd -a :6081 -f /etc/varnish/default.vcl -s malloc,256m
Её необходимо заменить на строку:
ExecStart=/usr/sbin/varnishd -a :80 -a 127.0.0.1:8443,proxy -f /etc/varnish/default.vcl -s malloc,512m
То есть мы убрали опцию -a :6081 (прослушивать порт 6081) и добавили опции -a :80 -a 127.0.0.1:8443,proxy для прослушивания соответствующих портов. Вы также можете отредактировать «-s malloc,256m» - это значение устанавливает, сколько мегабайт оперативной памяти будет выделено для хранения кэша, по умолчанию это 256 мегабайт.
Чтобы сохранить изменения и закрыть редактор нажмите Ctrl+x, введите Y и нажмите Enter.
Проверьте, чтобы в файле /etc/varnish/default.vcl
cat /etc/varnish/default.vcl
присутствовали следующие строки:
backend default { .host = "127.0.0.1"; .port = "8080"; }
Если их нет, то добавьте их.
Настройка Hitch для работы с Varnish
Hitch — это прокси, который поддерживает HTTPS. Именно Hitch будет принимать входящие соединения на 443 порт и отправлять их в Varnish, которая, в свою очередь, будет отправлять их в Apache.
Создадим папку и скопируем в неё файл конфигурации:
mkdir /etc/hitch/ cp /usr/share/doc/hitch/hitch.conf.example /etc/hitch/hitch.conf
Откроем его для редактирования
sudo 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/suip.biz.server.crt" private-key = "/etc/ssl/private/suip.biz.server.key" } # данную опцию можно использовать несколько раз # укажите столько сертификатов и ключей, сколько вам нужно pem-file = { cert = "/etc/ssl/certs/softocracy.ru.server.crt" private-key = "/etc/ssl/private/softocracy.ru.server.key" } pem-file = { cert = "/etc/ssl/certs/wxmaxima.ru.server.crt" private-key = "/etc/ssl/private/wxmaxima.ru.server.key" }
Создайте файл /lib/systemd/system/hitch.service (вместо vim можете использовать nano, который проще в использовании):
vim /lib/systemd/system/hitch.service
со следующим содержимым:
[Unit] Description=Hitch TLS unwrapping daemon After=network.target Documentation=https://github.com/varnish/hitch/tree/master/docs man:hitch(8) ConditionPathExists=/etc/hitch/hitch.conf [Service] ExecStart=/usr/sbin/hitch --user _hitch --group _hitch --config /etc/hitch/hitch.conf --quiet ExecReload=/bin/kill -HUP $MAINPID Type=simple Restart=on-failure PrivateDevices=true PrivateTmp=true ProtectHome=true ProtectSystem=full [Install] WantedBy=multi-user.target
Создайте пользователя _hitch:
useradd _hitch
Если вы ещё не запустили 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 редирект. Этот файл может располагаться по пути /srv/http/.htaccess.
Строки, отвечающие за редирект, могут быть примерно такими:
RewriteCond %{HTTPS} !on RewriteCond %{REQUEST_URI} !^/.well-known/ RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}
Обновление SSL сертификата при использовании Varnish и Hitch
Помните, что теперь за работу с HTTPS отвечает Hitch. Поэтому при обновлении сертификатов вместо перезапуска Apache необходимо перезагрузить Hitch:
systemctl reload hitch.service
Varnish без настройки бесполезен
Установленный вами Varnish практически бесполезен. От Varnish (как, например, и от файервола) без дополнительной настройки мало пользы. К примеру, по умолчанию время хранения кэша составляет всего 2 минуты и хеш не сохраняется если присланы кукиз даже для сайтов, которые кукиз не используют (эти кукиз могут устанавливаться счётчиками и блоками рекламы). Также много других нюансов.
Поэтому обязательно читайте вторую часть, полностью посвящённую настройке Varnish.
Кстати, если вам нужен недорогой, но производительный VPS сервер, то вы найдёте отличное предложение по этой ссылке.
Смотрите следующие части:
- Как настроить Varnish, примеры правил
- Вспомогательные программы Varnish
- Модули Varnish
Близкие статьи
- Как настроить Python в качестве CGI модуля в Apache на Arch Linux (Manjaro, BlackArch) (91.8%)
- Установка LAMP (Linux, Apache, MySQL/MariaDB, PHP8 и phpMyAdmin) в Arch Linux / BlackArch (79.1%)
- Установка ownCloud в Arch Linux / BlackArch (79.1%)
- Включение HTTP/2 в Apache на Arch Linux (79.1%)
- Настройка скрытого сервиса Tor в Arch Linux / BlackArch (79.1%)
- Решение проблемы Failed to configure CA certificate chain!, Fatal error initialising mod_ssl, exiting. (RANDOM - 50%)