Haproxy: попробуйте другой бэкэнд, если 404

Haproxy: попробуйте другой бэкэнд, если 404

У меня есть сервер haproxy с несколькими бэкендами за ним. Бэкенды выбираются циклическим перебором; в любом случае мне нужно, чтобы он пробовал другие бэкенды, если он получает 404 от выбранного.

Если со всех доступных бэкэндов возвращается код 404, haproxy должен вернуть клиенту код 404.

Это возможно?

решение1

Нет, это невозможно (на данный момент).

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

решение2

Нет. option redispatch— это самое близкое, что есть у HAProxy, но он будет только повторять попытки другого бэкенда, если retriesis > 0 и соединение с бэкендом не удается. Его не волнует код статуса HTTP от бэкенда, его волнует только то, что бэкенд упал (невозможно достичь, нет ответа)

решение3

Да, если я правильно понял, с опцией

option httpchk GET /../CheckHealth.html
http-check disable-on-404

Если CheckHealth.html должен быть доступным образцом ресурса, если ресурс не найден и получена ошибка 404, узел переводится в состояние «активный или резервный SOFT STOPPED для обслуживания», и циклический перебор никогда больше не отправляет запрос на этот узел, переключаясь только на другие.

Что-то вроде :

 backend backend_servers
 balance            roundrobin
 option httpchk GET /.../CheckHealth.html
 http-check disable-on-404
 server             www01 XX:YY:ZZ:KK:8180 check
 server             www02 XX:YY:ZZ:MM:8180 check
 server         www03 XX:YY:ZZ:FF:8180 check

произойдет сбой на www02, поскольку там не развернут WAR, и остаток на www01, www03 без отображения сбоя клиенту.

Связанный контент