Я использовал обратный прокси-сервер Varnish для нескольких веб-сайтов, и это отличная альтернатива. Однако он поддерживает только http, и теперь, когда сайты хотят реализовать https, у меня нет другой альтернативы.
Конфигурация varnish относительно сложна с правилами, которые управляют тем, что исключается, и различным временем кеширования, поэтому я ищу альтернативы. Cloudflares, вероятно, был бы вариантом, но из того, что я мог видеть, потребуется бизнес-план от 200 долларов в месяц.
Есть рекомендации?
Использовать HTTPS на Varnish не так уж и сложно. Хотя Varnish изначально не предлагает TLS, он облегчает завершение TLS.
В 2015 году вышел Varnish Сцепка, очень мощный прокси TLS, который обрабатывает завершающий TLS и перенаправляет незашифрованный HTTP-трафик в Varnish.
Ты можешь скачать исходник с сайта Hitch и скомпилируем на нашем сервере. Если вы хотите использовать пакеты для установки Hitch, вы можете запустить следующую команду на Debian или Ubuntu:
apt-get install -y hitch
После того, как вы установили Hitch, откройте /etc/hitch/hitch.conf
и убедитесь, что вы используете следующую конфигурацию:
frontend = {
host = "*"
port = "443"
}
backend = "[localhost]:8443"
write-proxy-protocol-v2 = on
pem-file = "/etc/hitch/certs/example.com"
ciphersuites = "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256"
ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
tls-protos = TLSv1.2 TLSv1.3
ecdh-curve = "X25519:prime256v1:secp384r1"
prefer-server-ciphers = false
Пожалуйста, положите свой сертификат
/etc/hitch/certs
и отрегулируйтеpem-file
директива вhitch.conf
.
Ваша конфигурация времени выполнения Varnish, вероятно, содержит следующую информацию для прослушивания:
varnish -a :80
Это означает, что Varnish прослушивает соединения на порту 80. Чтобы убедиться, что HTTPS работает, мы добавим еще один порт прослушивания, но с определенной конфигурацией:
varnish -a :80 -a :8443,PROXY
Не забудьте перезагрузить Varnish после изменения настроек времени выполнения.
Вы заметите, что порт 8843
теперь также назначен Varnish. Он не используется для стандартного HTTP, но для HTTP с использованием ПРОКСИ протокол. В Hitch также была включена поддержка протокола PROXY.
Это гарантирует, что исходный IP-адрес клиента передается Varnish, независимо от количества дополнительных переходов, которые он должен пройти. Исходный IP-адрес клиента будет автоматически сохранен в X-Forwarded-For
заголовок от Varnish.
Тип трафика, который обрабатывается портом. 8443
это HTTP-трафик, исходящий от Hitch и фактически завершенный HTTPS-трафик.
Hitch - это прокси TLS, он не понимает HTTP. Это означает, что он не может установить обычный X-Forwarded-Proto
заголовок, чтобы указать, какой тип трафика был прекращен. К счастью, мы можем отследить, какой порт использовался.
Приведенный ниже код VCL обнаруживает запросы HTTP / HTTPS и назначает правильный X-Forwarded-Proto
заголовок.
vcl 4.0;
import std;
sub vcl_recv {
if (std.port(local.ip) == 8443) {
set req.http.X-Forwarded-Proto = "https";
} else {
set req.http.X-Forwarded-Proto = "http";
}
}
Многие фреймворки и системы CMS используют
X-Forwarded-Proto
заголовок для автоматического построения правильных схем URL. Тот факт, что мы устанавливаем этот заголовок в VCL, очень помогает.
В кеше хранятся HTTP-ответы, а не HTTP-запросы. Поэтому, когда объект сохраняется в кеше, Varnish не знает, откуда он пришел: по HTTP или HTTPS URL. Если мы начнем кэшировать их без дополнительных мер, вы можете застрять в бесконечный цикл перенаправления если Varnish начинает кэшировать HTTP-версию объекта.
Чтобы этого не произошло, Varnish должен иметь вариант кеша по протоколу. Вы можете легко проинструктировать Varnish сделать это, вернув следующие Заголовок ответа HTTP в вашем бэкэнд-приложении:
Vary: X-Forwarded-Proto
Если по какой-то причине это невозможно, вы также можете продлить vcl_hash
логика в вашем коде VCL. В этом случае добавьте следующий фрагмент:
sub vcl_hash {
hash_data(req.http.X-Forwarded-Proto);
}