Как сделать так, чтобы HAProxy переписывал на другой бэкэнд, когда в первом отсутствует файл? Мне нужно errorloc
только переписать вместо перенаправления, чтобы клиент не знал о перенаправлении.
Мы разработали приложение с учетом NginX, которое было одновременно балансировкой нагрузки обратного прокси-сервера и веб-сервера для статических файлов. Приложение основано на платформе Opa, для которой требуются липкие сеансы на основе файлов cookie, поддерживаемые как 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, только приходит мне в голову, но я хотел бы найти что-то лучшее.