У меня есть haproxy-сервер с несколькими бэкэндами. Бэкенды выбираются по круговой системе; в любом случае мне нужно попробовать другие бэкенды, если он получит 404 от выбранного.
Если 404 возвращается из всех доступных бэкендов, haproxy должен вернуть 404 клиенту.
Это возможно?
Нет, это невозможно (на данный момент).
HAProxy повторяет попытку другого внутреннего сервера, если есть ошибки до отправки запроса, например тайм-аут соединения. Если соединение установлено с одним внутренним сервером и отправлен запрос, даже один байт, HAProxy не будет пытаться использовать другой внутренний сервер.
Нет. option redispatch
это самое близкое к HAProxy, но оно будет пытаться использовать другой сервер, только если retries
> 0, и соединение с резервным сервером не удается. Ему не важен код состояния HTTP из бэкэнда, он просто заботится о том, откатился ли он (недоступен, нет ответа)
Да, если я правильно понял, с возможностью
option httpchk GET /../CheckHealth.html
http-check disable-on-404
Где CheckHealth.html должен быть доступным образцом ресурса, если ресурс не найден и получена ошибка 404, узел был установлен в «активный или резервный SOFT STOPPED для обслуживания», и roundrobin никогда не будет отправлять запрос этому узлу, переключаясь на только остальные.
Что-то вроде :
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 без показа сбоев клиенту.