You are here: Home » Инструкции » Как установить Varnish в Arch Linux — кэширование для Apache

Как установить Varnish в Arch Linux — кэширование для Apache

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 сервер, то вы найдёте отличное предложение по этой ссылке.

Смотрите следующие части:

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

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

4. Модули Varnish

Добавить комментарий

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

wp-puzzle.com logo