HAProxy - Обслуживание URL со 2-го компьютера, если 1-й возвращает 404 - PullRequest
0 голосов
/ 04 июня 2018

У меня есть ситуация, когда у меня есть часть веб-сайта (определенные пути URL), обслуживаемая с одного внутреннего сервера, в то время как все другие URL обслуживаются с другого внутреннего сервера по умолчанию в HAProxy.

Теперь, из-заПри написании логики приложения файлы, которые будут обслуживаться по одному и тому же URL-пути, могут быть созданы по одному и тому же пути на любом из двух физических серверов.Я хотел бы иметь возможность обслуживать эти файлы независимо от того, на какой машине этот файл существует.Итак, в двух словах, как я могу переслать запрос в один бэкэнд, и если ответ 404 (файл там не существует), перенаправить запрос на обслуживание из другого бэкэнда?

Я являюсьполный noob к HAProxy, так что любая помощь будет оценена.Спасибо.

Соответствующие части моего haproxy.conf:

frontend frontend0 ... acl de path_beg /path1 acl de path_beg /path2 acl de path_beg /path3 use backend backend1 if de default_backend bakend backend backend1 ... server server_name 127.0.0.1:8000 backend backend2 ... server server_name 192.168.11.1:8000

Существует путь /path4, который необходимо обслуживать с обеих этих машин в зависимости ото том, где файл существует.

1 Ответ

0 голосов
/ 16 июня 2018

Спасибо @ Michael-sqlbot за подсказку и за этот вопрос о ServerFault для наброска ответа.Конфигурация, которую я окончательно использовал, выглядит следующим образом:

  • Я настраиваю отдельный URL / _path4, который подается из одного бэкэнда, а исходный URL / path4 - из другого бэкэнда.
  • Получив ответ 404 от первого бэкэнда для / path4, я перенаправляю на URL / _path4

Мой файл конфигурации теперь выглядит следующим образом:

frontend frontend0 ... acl de path_beg /path1 acl de path_beg /path2 acl de path_beg /path3 acl de path_beg /_path4 use_backend backend2 if de default_backend backend1 ... backend backend1 ... http-request set-var(txn.path) path server server_name 127.0.0.1:8000 http-response redirect location %[var(txn.path),regsub('^/path4','/_path4')] code 303 if { status 404 } { var(txn.path) -m beg '/path4' } ... backend backend2 ... server server_name 192.168.11.1:8000

Как объяснено в превосходных комментариях @ Michael-sqlbot к связанному вопросу, требуется установка переменной транзакции, поскольку на этапе http-response буфер был освобожден, и поэтому обычная переменная path, используемая ввнешний интерфейс недоступен.

...