Вопрос или проблема
Я пытаюсь реализовать балансировщик нагрузки на основе проверки состояния.
Если один из ингрессов кластера выходит из строя, необходимо перенаправить запросы на другой ингресс кластера.
Я сделал следующее
upstream backend {
server primary max_fails=2, timeout2s;
server secondary backup;
}
location / {
resolver dns-default.openshift-dns;
proxy_pass https://backend;
proxy_pass_request_headers on;
proxy_ssl_server_name on;
proxy_ssl_name <active_ingress_dns??>;
proxy_set_header Host <active_ingress_dns??>;
}
Я застрял на том, как получить активный DNS ингресс, поскольку он нужен для установки имени SSL прокси и заголовка хоста в блоке location выше, иначе я всегда получаю ошибку 502 Bad Gateway.
Я пробовал использовать блоки map
map $upstream_addr $aidns{
121.12.11.12 "primary.com"
123.23.32.12 "secondary.com"
}
но $aidns не всегда последовательный. Иногда он выводит имя upstream, ip с именем upstream.
Есть ли способ, с помощью которого я могу постоянно получить доменное имя?
Или есть ли обходной путь, чтобы я мог перенаправить запрос на рабочий ингресс в OpenResty.
Ответ или решение
Чтобы успешно реализовать балансировщик нагрузки на основе проверки состояния в Nginx и правильно настроить проксирование запросов к активному ингрессу, вам потребуется обеспечить определение DNS имени активного сервера в блоке location
. Ниже приведены шаги и рекомендации по решению вашей проблемы.
Шаг 1: Использование resolve
для динамического разрешения DNS
Вам нужно настроить resolver
для определения активного DNS имени на основе IP-адреса. Ваш первоначальный пример уже включает resolver
, что является правильным шагом. Однако, чтобы получить правильное DNS имя в proxy_ssl_name
и proxy_set_header Host
, необходимо использовать переменные.
Шаг 2: Определение переменной активного DNS имени
Вы можете использовать переменную $upstream_addr
для получения адреса текущего активного сервера. Целесообразно использовать map
блок, чтобы определить, к какому DNS-имени соответствует IP-адрес.
map $upstream_addr $active_host {
"121.12.11.12" "primary.com";
"123.23.32.12" "secondary.com";
}
Шаг 3: Настройка процесса проксирования
Следующий шаг — это настройка блока location
, где будут использованы переменные для проксирования:
location / {
resolver dns-default.openshift-dns;
proxy_pass https://backend;
proxy_pass_request_headers on;
proxy_ssl_server_name on;
# Использование переменной активного хоста
proxy_ssl_name $active_host;
proxy_set_header Host $active_host;
}
Примечание по обработке ошибок
-
Проверка работоспособности: Убедитесь, что адреса IP, указанные в блоке
map
, соответствуют реальным адресам ваших серверов. Вы можете использовать командыping
илиnslookup
, чтобы подтвердить это. -
Проверка состояния сервера: Убедитесь, что неправильно работающие узлы сервера действительно помечаются как "неисправные", чтобы они не использовались для проксирования.
-
Логи Nginx: Если у вас возникают ошибки (например, 502 Bad Gateway), рекомендуется проверить журналы Nginx (
error.log
), чтобы определить, в чем проблема. Это может помочь диагностировать проблемы в настройках или подключении к серверу.
Заключение
Следуя приведенным инструкциям, вы сможете динамически определять и использовать активное имя хоста для проксирования в Nginx. Правильное использование переменных и блоков map
даст вам гибкость в управлении запросами и поможет избежать ошибок, связанных с неправильным конфигурированием.