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

Могу ли я настроить mod_proxy для использования различных параметров на основе метода HTTP?

я использую mod_proxy как отказоустойчивый прокси с двумя участниками баланса.

Пока mod_proxy помечает мертвые узлы как мертвые, он по-прежнему направляет один запрос в минуту на каждый мертвый узел и, если он все еще мертв, либо вернет 503 клиенту (если maxattempts=0) или повторите попытку на другом узле (если он> 0).

Бэкэнды обслуживают веб-службу REST. В настоящее время я установил maxattempts=0 потому что я не хочу повторять POST и DELETE. Это означает, что, когда один узел не работает, каждую минуту случайный клиент будет получать 503. К сожалению, большинство наших клиентов интерпретируют коды вроде 503 как «все мертво», а не «что не сработало, попробуйте еще раз».

Чтобы запрограммировать автоматическую повторную попытку для безопасных запросов на уровне прокси, я хотел бы настроить mod_proxy для использования maxattempts=1 для запросов GET и HEAD и maxattempts=0 для всех остальных HTTP-методов.

Это возможно? (И как? :)

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

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

Я думаю, вам может не повезти - насколько я могу судить, "очевидный" способ сделать это (с <Limit> block) работает только для операций, связанных с контролем доступа; Я подозреваю, что это будет невыполнимо.

В целом, однако, я не думаю, что это поможет достичь того, чего, по вашему мнению, вы хотите достичь. По моему опыту, обычно вы действительно хотите напротив из того, что вы описали; повторять неидемпотентные запросы к нескольким бэкэндам - ​​обычно плохая идея (на случай, если они выполнили операцию, но не сообщили об успехе); вам будет гораздо лучше, если вы быстро откажетесь от всего и попросите браузер обработать повторную попытку, если это необходимо.