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.