У меня есть веб-сервер Apache httpd, на котором запущены mod_proxy и mod_proxy_balancer. Весь файл / somedir отправляется на 2 рабочих машины, которые обслуживают запросы с помощью планировщика циклического перебора. На каждой рабочей машине работает IIS, но я не думаю, что это важно.
Я могу продемонстрировать работу балансировщика нагрузки, неоднократно запрашивая одну страницу, которая содержит IP-адрес машины, и вижу, что она переключается с одного на другой в предсказуемой циклической манере.
Если я выключу один из серверов IIS и начну запрашивать ту же страницу, то каждая страница будет содержать только IP-адрес машины, которая работает. Однако, если я запускаю IIS и не запускаю свое приложение IIS, то / somedir возвращает 500 (как и должно).
Я добавил 500 к failonstatus (Apache 2.4), поэтому, когда он обнаруживает ошибку, Apache переводит рабочий компьютер в состояние ошибки. Однако Apache по-прежнему возвращает клиенту ошибку прокси. Как я могу заставить Apache перехватить сбой прокси-сервера и повторить попытку, используя другого воркера, так же, как это происходит при сбое соединения.
Обновить
В StackOverflow задается почти тот же вопрос, поэтому объедините их вместе.
Я поговорил с одним из разработчиков в списке рассылки httpd, и он подтвердил, что эта функция не реализована в текущей базе кода. Я также сам просмотрел код. Конечный автомат внутри mod_proxy_balancer не может повторить попытку при ошибке HTTP, но может сделать это только в случае ошибки соединения. Я пытался реализовать это сам, но это слишком сложно, и я легко могу сделать базу кода нестабильной.
Так что сегодня у этой проблемы нет известного решения ...
На всякий случай, если кто-то снова задаст этот вопрос: failonstatus
Директива была реализована с Apache 2.2.27.
<Proxy balancer://backends>
BalancerMember http://10.1.1.11
BalancerMember http://10.1.1.12
ProxySet failonstatus=500
</Proxy>
Журнал:
[Thu Apr 28 03:13:06.176916 2016] [proxy_balancer:error] [pid 3285:tid 140231873353472] [client 10.1.1.1:43608] AH01174: balancer://puppetmaster: Forcing worker (http://10.1.1.12) into error state due to status code 500 matching 'failonstatus' balancer parameter