Как получить имя DNS из блока upstream в конфигурации nginx

Вопрос или проблема

Я пытаюсь реализовать балансировщик нагрузки на основе проверки состояния.

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

Я сделал следующее

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;
}

Примечание по обработке ошибок

  1. Проверка работоспособности: Убедитесь, что адреса IP, указанные в блоке map, соответствуют реальным адресам ваших серверов. Вы можете использовать команды ping или nslookup, чтобы подтвердить это.

  2. Проверка состояния сервера: Убедитесь, что неправильно работающие узлы сервера действительно помечаются как "неисправные", чтобы они не использовались для проксирования.

  3. Логи Nginx: Если у вас возникают ошибки (например, 502 Bad Gateway), рекомендуется проверить журналы Nginx (error.log), чтобы определить, в чем проблема. Это может помочь диагностировать проблемы в настройках или подключении к серверу.

Заключение

Следуя приведенным инструкциям, вы сможете динамически определять и использовать активное имя хоста для проксирования в Nginx. Правильное использование переменных и блоков map даст вам гибкость в управлении запросами и поможет избежать ошибок, связанных с неправильным конфигурированием.

Оцените материал
Добавить комментарий

Капча загружается...