HAProxy — обнаружение ошибок HTTP-сервера

HAProxy — обнаружение ошибок HTTP-сервера

Я хочу использовать HAProxy для балансировки нагрузки и отказоустойчивости приложения Apache-PHP, размещенного на многих идентичных внутренних серверах. Есть ли способ обнаружить отказавший узел на HAproxy и удалить его из активной группы узлов в контексте одного HTTP-запроса без возврата ошибки 5xx.

В идеале сервер может вернуть заголовок ответа «Статус: Ошибка», а HAProxy должен обнаружить этот заголовок и удалить этот конкретный узел из активного набора.

Я не могу вернуть ошибку 5xx из своего приложения.

Возможна ли такая конфигурация для HAProxy?

решение1

Ответ 5xx все равно остается ответом, поэтому по умолчанию он будет передан клиенту.

Я не видел продукта, который бы из коробки выходил на тот уровень, о котором вы говорите. Если таковых не существует, вам нужен балансировщик нагрузки, который позволяет вам писать пользовательское правило ответа поста, и чтобы это правило имело доступ к изменению состояния плохого узла в пуле и обратному отправке запроса в ваш пул.F5 BigIP,Речной скат StingRay (Zues)безусловно, предлагают элемент скриптинга и управления узлами (f5 например вниз по низу).ЛакиКальмархотя и не чистые балансировщики нагрузки предлагают возможность изменять ответы после ответа бэкенда. Я не уверен насчет их доступа к управлению узлом/пулом. Обратите внимание, что вам также нужно будет иметь дело с тайм-аутами запросов таким же образом, как и с ответами 5xx.

Страница, которую вы используете для мониторинга состояния узлов, также должна быть чем-то, что тщательно проверяет состояние приложений и может быть использовано довольно часто.

Ближайший к этому HAProxy выглядит так:observe <mode>что позволяет ему реагировать на ошибки, возникающие в обычном трафике.

Я не могу вернуть ошибку 5xx из своего приложения.

В какой-то момент это произойдет, будьте к этому готовы.

решение2

Я согласен с большинством комментариев mindthemonkey. Обратите внимание, что вы также можете заблокировать ответ и заменить его пользовательским содержимым (используя ошибку 502), но это немного ограничено (например: это может быть использовано для отправки перенаправления, чтобы заставить браузер снова отправить запрос) и довольно грязно.

Почему вы хотите сделать это в первую очередь? Говорить, что вы "не можете вернуть 5xx" неправильно, так как вы в любом случае это сделаете, и клиентам тоже придется иметь с этим дело по определению и по спецификации. Это потому, что вы находитесь за CDN, который ведет себя неправильно при возврате 5xx? Если так, возможно, вам просто стоит переписать выходные коды ошибок (но будьте очень осторожны с кодами, которые вы используете, все они имеют очень специфическую семантику).

решение3

Правин, если вы используете PHP 5.4 и выше, это должно помочь вашему PHP-приложению:

Если вы используете PGP 4.3–5.3, вы можете вместо этого использовать header() (проверьте страницы руководства, чтобы узнать, как это сделать).

Технически вы можете настроить HAProxy на выполнение того, что вы просите, но, вероятно, более целесообразно просто изменить ваше приложение, чтобы оно вел себя правильно. В этот момент HA Proxy должен справиться с этим более или менее автоматически.

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