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

NGINX: переключение на резервное копирование в восходящем потоке ip_hashed

Я использую NGINX в качестве балансировщика нагрузки для запуска нескольких экземпляров моего сайта. Я работаю над условной маршрутизацией для отправки пользователей на определенные серверы на основе входящего HTTP-заголовка. Конечная цель - иметь бета-версию восходящего потока с X-серверами с балансировкой нагрузки с использованием ip_hashing для отправки пользователям, у которых есть флаг бета-тестера, и стабильный восходящий поток с Y-серверами для тех, кто не выбрал.

Моя проблема связана с переключением из одной группы в другую - в частности, бета-пользователей следует перенаправить на стабильные серверы, если бета-серверы недоступны. К сожалению, ни директивы резервного копирования, ни веса не работают в восходящем потоке ip_hashed, несмотря на то, что текущая документация NGINX, похоже, указывает, что они должны работать.

В качестве обходного пути я пытаюсь создать настраиваемое местоположение ошибки для ошибок 502 и 504, которое выполняет proxy_pass для моего стабильного восходящего потока. Однако, когда я тестирую свою конфигурацию, я обнаруживаю, что страница пуста с заголовком 504 и без перенаправления. Основывая свое текущее решение на этом потоке:

worker_processes  2;

events {
    worker_connections  1024;
}


http {
    upstream dataserver_stable {
        ip_hash;
        server localhost:8081;
    }

    upstream dataserver_beta {
        ip_hash;
        server localhost:8082 fail_timeout=1m;
        #server localhost:8081 backup; # backup and weight aren't working with the ip_hash directive
    }

    geo $beta_user {
        default stable;
        10.17.12.246 beta;
    }

    map $beta_user $upstream {
        stable dataserver_stable;
        beta dataserver_beta;
    }

    server {
        listen       81;
        server_name  localhost;

        set_real_ip_from 27.0.0.1;
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;

        location / {
                error_page 502 504 @fallback;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $realip_remote_addr;
                proxy_pass       http://$upstream;
                proxy_connect_timeout 5s;
                proxy_read_timeout 10s;
        }

        location @fallback {
            proxy_pass  http://dataserver_stable;
        }
    }

}

Любой совет будет принят во внимание.