Como fazer Nginx fogo 504 imediatamente se o servidor não está disponível?

1

Eu tenho o Nginx configurado como um balanceador de carga com viscosidade baseada em cookie. A lógica é:

  1. Se o cookie NÃO estiver lá, use round-robbing para escolher um servidor do cluster.
  2. 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:

  3. 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.

    
por Georgii Ivankin 02.06.2014 / 16:09

1 resposta

0

upstream appservers {
    zone appservers 64k;

    server appserv1.example.com      weight=5;
    server appserv2.example.com:8080 fail_timeout=5s slow_start=30s;
    server 192.0.2.1                 max_fails=3;

    server reserve1.example.com:8080 backup;
    server reserve2.example.com:8080 backup;
}

Lá vai você! De docs

HTH

    
por 02.06.2014 / 16:34