У меня есть сервер haproxy с несколькими бэкендами за ним. Бэкенды выбираются циклическим перебором; в любом случае мне нужно, чтобы он пробовал другие бэкенды, если он получает 404 от выбранного.
Если со всех доступных бэкэндов возвращается код 404, haproxy должен вернуть клиенту код 404.
Это возможно?
решение1
Нет, это невозможно (на данный момент).
HAProxy повторяет попытку другого бэкенд-сервера, если до отправки запроса возникли ошибки, например, тайм-аут соединения. Если соединение установлено с одним бэкенд-сервером и отправлен запрос, даже один байт, HAProxy не будет пытаться использовать другой бэкенд-сервер.
решение2
Нет.
option redispatch
— это самое близкое, что есть у HAProxy, но он будет только повторять попытки другого бэкенда, если retries
is > 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 без отображения сбоя клиенту.