Рейтинг:1

Обнаружение 502 ответов в Nginx Load Balancer

флаг jm

У меня есть следующая настройка — балансировщик нагрузки Nginx, который получает https-трафик и проходит через узлы. На каждом узле есть обратный прокси-сервер, который обрабатывает https-трафик и передает данные в App1, App2 в виде простого текста.

--> LB --> RP -> App1, App2
       `-> RP -> App1, App2

Теперь проблема в том, что если приложение App1 не работает на узле, балансировщик нагрузки не обнаруживает этого и с радостью возвращает клиенту 502. Я предполагаю, что обратный прокси-сервер все еще работает и шифрует трафик, поэтому балансировщик нагрузки просто пропускает данные. Как я могу сообщить балансировщику нагрузки, что App1 на узле 1 не работает, и перейти к другому узлу?

Упрощенный LB nginx.conf:

транслировать {
    карта "$ssl_preread_server_name:$server_port" $namehttps {
        имена хостов;
        какой-то адрес.io:8443 test_site;
    }

    вышестоящий test_site {
        сервер 192.168.1.10;
        сервер 192.168.1.11
    }
    сервер {
        proxy_pass $имяhttps;
        ssl_preread включен;
    }
}

Обратный прокси-сервер nginx.conf действует как стандартный обратный прокси-сервер, завершающий ssl-трафик и передавая незашифрованный трафик приложению.

Рейтинг:0
флаг my

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

Согласно документации NGINX (https://docs.nginx.com/nginx/admin-guide/load-balancer/http-health-check/), которые я собираюсь обобщить здесь, в случае, если страница переходит на 404, вам необходимо:

  • определить в сервер часть конфигурации а место расположения / (или аналогичный путь) раздел;

  • включить proxy_pass и проверка состояния здоровья директива в локации/(или аналогичном) разделе;

  • в http вверх по течению группу серверов, определите общую память, добавив бэкэнд зоны 64k (или аналогичное значение).

Однако это не работает, если вы используете транслировать block, потому что потоки работают на уровне TCP/UDP. Восходящий поток должен содержаться в http блок, поэтому вы можете воспользоваться функциями более высокого уровня http модуль.

Рейтинг:0
флаг cz

Проблема в том, что вы используете транслировать и не должно быть.

nginx не видит полезную нагрузку соединения при использовании транслировать прокси. У него даже нет возможности узнать, есть ли там HTTP, и нет транслировать заботиться о полезной нагрузке.

Вам нужно будет использовать «стандартный обратный прокси-сервер, завершающий ssl-трафик».

Rapolas K. avatar
флаг jm
Я не могу избежать использования потока, так как это универсальный балансировщик нагрузки. Кроме того, я не могу терминировать ssl-трафик на балансировщике нагрузки, так как есть требование, чтобы незашифрованный трафик не проходил по сети (даже если он внутренний).
Michael Hampton avatar
флаг cz
@РаполасК. Тогда вы не сможете обнаружить ответы 502. Вам придется сделать что-то еще. Но почему вы не можете перешифровать трафик?

Ответить или комментировать

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