Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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