NGINX: Failover para backup em upstream ip_hashed

1

Estou usando o NGINX como um balanceador de carga para executar várias instâncias do meu site. Estou trabalhando em roteamento condicional para enviar usuários para servidores específicos com base em um cabeçalho HTTP de entrada. O objetivo final é ter um upstream beta com servidores X com balanceamento de carga usando ip_hashing para enviar aos usuários que têm o sinalizador do beta tester e um upstream estável com servidores Y para aqueles que ainda não optaram.

Meu problema é com failover de um grupo para outro - especificamente, os usuários beta devem ser redirecionados para servidores estáveis se nenhum servidor beta estiver disponível. Infelizmente, nem as diretivas de backup nem peso estão trabalhando dentro de um upstream ip_hashed, apesar da documentação atual do NGINX parecer indicar que elas devem funcionar.

Como uma solução alternativa, estou tentando ter um local de erro personalizado para 502 e 504 que faz um proxy_pass para meu upstream estável. No entanto, quando eu testo minha configuração, descubro que a página está em branco com um cabeçalho 504 e nenhum redirecionamento. Baseando minha solução atual fora deste segmento:

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

}

Qualquer conselho seria apreciado.

    
por Paul Murray 28.11.2017 / 22:33

0 respostas