Вопрос: HAProxy URL переписать по ошибке 404


Как заставить HAProxy переписываться на другой сервер, если первый отсутствует в файле? Что мне нужно errorloc но вместо переадресации переписывать, поэтому клиент не знает о перенаправлении.

Мы разработали приложение с учетом NginX, которое было как балансирующим нагрузкой обратным прокси, так и веб-сервером для статических файлов. Применение основано на Opa которая требует липких сеансов на основе куки-файлов, поддерживаемых как NginX, так и HAproxy. Особенность приложения, с которой мы имеем дело, - это создание динамического контента. Он генерирует изображения по требованию, но после поколения он сохраняется на диске и может быть доступен статически с детерминированным путем.

Проблема была легко решена с помощью NginX - она ​​пытается читать локальный файл и использовать балансировку нагрузки, только если файл отсутствует (еще не сгенерирован):

server {
  server_name wkaliszu.pl;
  location /thumb {
    root /path_on_disk/to_cached_content;
    expires 7d;
    # try to access already generated content
    try_files $uri @wkaliszu;
  }
  location / {
    # reverse proxy to the application
    [...]
  }
  location @wkaliszu {
    # reverse proxy to the application
    [...]
  }
}

Сервер был перенесен и теперь использует HAPproxy для балансировки нагрузки, который не является веб-сервером и не поддерживает эту функцию. Теперь динамическое создание программного обеспечения выполняется каждый раз, когда клиент пытается получить доступ к ресурсу, что намного медленнее и тратит ресурсы. Было бы хорошо, если бы он мог использовать следующий back-end, если первый (простой кеширующий веб-сервер для статических файлов) потерпел неудачу с ошибкой 404, но я не могу найти способ сделать это простым способом. Перенаправление /thumb к NginX, который пытается прочитать статический файл и снова перезаписывает HAproxy с новым HTTP-заголовком, приходит мне на ум, но я хотел бы найти что-то лучшее.


9
2018-02-02 09:04


Источник


Какой стек приложения используется серверами приложений? - jeffatrackaid


Ответы:


Бэкэнды HAProxy находятся либо вверх, либо вниз (или на пути к тому, чтобы быть вверх / вниз).

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

Это совсем другая логика, чем ваша настройка Nginx, которая была запросом маршрутизации для каждого запроса.

Здесь я вижу несколько вариантов:

  • Nginx в качестве кэширующего прокси
  • Использовать серверы приложений для статического контента
  • Использовать CDN

Кэширование прокси

В HAProxy вы должны использовать ACL для маршрутизации статических запросов контента на конкретный сервер. Эти базовые узлы будут запускать nginx с кэширующим прокси. Если nginx сохранил файл, он просто будет его обслуживать. Если нет, это вызовет ваш сервер.

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

Если ваши серверы приложений эффективны при обслуживании статического контента, вам может не понадобиться разделить запрос в haproxy. Просто отправьте весь запрос в свои приложения. Построить логику в них для обслуживания статического контента, если он доступен, и если не отправить запрос на бэкэнд.

Вариант CDN

Если вы можете использовать выделенный домен для статического контента, вы можете использовать CDN. На CDN вы просто указываете URL-адрес источника на свои узлы приложения. Затем вы можете контролировать кеширование на уровне CDN. Это похоже на кеширование Nginx, за исключением того, что поставщик CDN обрабатывает его для вас.


1
2017-09-10 21:14