Varnish: серверная часть с несколькими IP-адресами (или используйте что-то еще)

Я разрабатываю систему, которая подключается к внешней серверной службе (приобретенной у другой компании), где система будет намного превышать месячную квоту запросов. Я пытаюсь создать прокси/кэш, который будет кэшировать запросы и использовать кешированный ответ, если он присутствует.

Случаи использования:

Случай 1:

  1. Пользователь запрашивает конечную точку
  2. Прокси не кэширует
  3. Прокси перенаправляет запрос на внешний сервер
  4. Прокси кеширует ответ
  5. Прокси возвращает ответ пользователю

Случай 2:

  1. Пользователь запрашивает конечную точку
  2. Прокси закешировал
  3. Прокси возвращает кешированный ответ

Случай 3:

  1. Внешний бэкэнд отправляет веб-хук, говорящий, что все было обновлено
  2. Прокси очищает кеш

Требования:

  • Прокси должен иметь возможность кэшировать файлы (в основном изображения)
  • Три разных URL: url1.external-backend.com, url2.external-backend.com и url3.external-backend.com
  • Желательно только один прокси для всех трех URL:
  • Три URL-адреса могут иметь разные пути (url1.external-backend.com/this/is/a/path), а также могут быть запросы (url1.external-backend.com?query=something).
  • Было бы неплохо, если бы прокси можно было очищать на основе того, что отправляется из внешнего бэкенда, но это не обязательно.

Мысли на данный момент:

Я рассматривал для этого две разные системы: Varnish (https://varnish-cache.org/) и Squid (http://www.squid-cache.org/). Пробовал со Squid но так и не понял как настроить конфиг чтобы работал как выше. Образец конфигурационного файла был действительно запутанным и непонятным, и я не смог найти для него никакого руководства в Интернете.

Я изучил Varnish и, насколько я понимаю, его можно было бы использовать. Но у меня есть проблема.

Проблема:

В Varnish /etc/varnish/default.vcl есть возможность добавлять бэкенды, поэтому я добавил следующее:

backend page2 {
    .host = "url2.external-backend.com";
    .port = "443";
}

Это дает что-то похожее на это (я точно не помню, и я не вижу сообщение об ошибке прямо сейчас):

Backend host "url2.external-backend.com": resolves to multiple IPv4 addresses.
Only one address is allowed.
Please specify which exact address you want to use, we found these:
        xxx.xxx.xxx.xxx
        xxx.xxx.xxx.xxx
        xxx.xxx.xxx.xxx

Я не осмеливаюсь указать один из IP-адресов вместо имени хоста, и я не уверен, что создание директора является правильным способом. Причина этого в том, что я не контролирую имя хоста, и они не могут гарантировать, что IP-адреса не изменятся.

Вопросы:

  1. Можно ли как-то заставить это работать в Varnish?
  2. Может ли кто-нибудь объяснить, как именно должна выглядеть конфигурация Squids, чтобы работать в соответствии с приведенными выше вариантами использования и требованиями (если возможно)?
  3. Есть ли какой-нибудь другой кеширующий прокси-сервис, который мог бы работать лучше, чем Varnish или Squid?

person BluePrint    schedule 03.04.2019    source источник


Ответы (2)


Я считаю, что vmod-goto - это то, что вы ищете: https://docs.varnish-software.com/varnish-cache-plus/vmods/goto/

Это не открытый исходный код, но он решает именно вашу проблему.

person Arianna Aondio    schedule 04.04.2019

1 и 2 можно сделать без проблем. Для бэкэндов на основе DNS с циклическим перебором (одно и то же имя дает разные IP-адреса для каждого запроса) вам следует обратиться к директорам, которые имеют специальную поддержку для циклического перебора: https://www.varnish-software.com/wiki/content/tutorials/varnish/multiple_varnishes.html#

3 тоже можно сделать. Например, с помощью HTTP-запроса PURGE. Просто убедитесь, что вы внесли в белый список IP-адреса, так что это. https://www.varnish-software.com/wiki/content/tutorials/varnish/vcl_examples.html#

person Jensd    schedule 03.04.2019
comment
Проблема в том, если я правильно понимаю, что мне нужно специально указать разные IP-адреса в циклическом DNS, или я ошибаюсь? Как я уже писал, я не контролирую имя хоста, и они не могут гарантировать, что IP-адреса не изменятся. И я не хочу отслеживать, когда они меняют IP-адреса. Система критична для бизнеса, поэтому я не могу позволить ей выйти из строя из-за этого. - person BluePrint; 04.04.2019
comment
@BluePrint Нет, с помощью директоров вы должны иметь возможность указывать имена, даже если они разрешаются на разные IP-адреса для каждого запроса. - person Jensd; 04.04.2019
comment
Ага, так что в основном я помещаю URL-адрес, а не IP-адреса в хосте сервера директора? - person BluePrint; 04.04.2019
comment
Я так понимаю. Хотя я сам не работал с режиссерами. - person Jensd; 04.04.2019