Eu tenho o Nginx configurado como um balanceador de carga com viscosidade baseada em cookie. A lógica é:
- Se o cookie NÃO estiver lá, use round-robbing para escolher um servidor do cluster.
-
Se o cookie estiver lá, vá para o servidor que está associado ao valor do cookie. O servidor é responsável pela configuração do cookie.
O que eu quero adicionar é isto:
-
Se o cookie estiver lá, mas o servidor estiver inativo, recue para a etapa de roubo de rodada para escolher o próximo servidor disponível.
Então, na verdade, tenho o balanceamento de carga e quero adicionar suporte a failover sobre ele.
Eu consegui fazer isso com a ajuda da diretiva error_page
, mas não funciona como eu esperava.
O problema: 504 (e o fallback associado a ele) são acionados somente após o tempo limite de 30s, mesmo que o servidor não esteja fisicamente disponível.
Então, o que eu quero que o Nginx faça é disparar um 504 (ou qualquer outro erro, não importa) imediatamente (suponho que isso signifique: quando a conexão TCP falhar). Esse é o comportamento que podemos ver nos navegadores: se formos diretamente para o servidor quando ele estiver inoperante, o navegador imediatamente nos diz que ele não pode se conectar. Além disso, o Nginx parece estar fazendo isso para o erro 502: se eu intencionalmente desconfigurar meus servidores, o Nginx dispara 502 imediatamente.
Configuração (reduzida ao básico):
http {
upstream my_cluster {
server 192.168.73.210:1337;
server 192.168.73.210:1338;
}
map $cookie_myCookie $http_sticky_backend {
default 0;
value1 192.168.73.210:1337;
value2 192.168.73.210:1338;
}
server {
listen 8080;
location @fallback {
proxy_pass http://my_cluster;
}
location / {
error_page 504 = @fallback;
# Create a map of choices
# see https://gist.github.com/jrom/1760790
set $test HTTP;
if ($http_sticky_backend) {
set $test "${test}-STICKY";
}
if ($test = HTTP-STICKY) {
proxy_pass http://$http_sticky_backend$uri?$args;
break;
}
if ($test = HTTP) {
proxy_pass http://my_cluster;
break;
}
return 500 "Misconfiguration";
}
}
}
Aviso: Estou muito longe da administração de sistemas de qualquer tipo, então pode haver algumas noções básicas que eu sinto falta aqui.
EDIT: Estou interessado em solução com versão gratuita padrão do Nginx, não Nginx Plus. Obrigado.