Balanceamento de carga no Nginx com redirecionamento em vez de proxy

2

Eu quero usar o Nginx de uma maneira pouco convencional. Eu quero balanceamento de carga entre alguns servidores, mas em vez de conteúdo de proxy para os servidores que eu quero redirecionar para eles.

Ou seja, se um pedido entrar em meu servidor Nginx, ele deve redirecionar para outro servidor, escolhendo aleatoriamente um de um bloco upstream ou equivalente. Eu nem preciso dos outros recursos de bloco upstream, como a ponderação (mas não faria mal em tê-los disponíveis, se possível).

Por enquanto, eu tenho a seguinte configuração, que faz o que eu preciso, mas é um pouco feia:

upstream boxes {
        server 127.0.0.1:46011;
        server 127.0.0.1:46012;
}

server {
        listen 46011;
        return 302 http://box11.example.com$request_uri;
}

server {
        listen 46012;
        return 302 http://box12.example.com$request_uri;
}

server {
        listen 80;
        server_name example.com;

        location / {
                proxy_pass http://boxes;
        }
}

Existe uma maneira mais simples de lidar com essa situação sem recorrer a proxy para mim mesmo?

    
por Brad 22.05.2014 / 05:50

1 resposta

4

Você pode obter uma variável aleatória do módulo misc:

set_random $loc_rnd 1 10;

Em seguida, escolha a localização interna com base nela, com ponderação simples:

map $loc_rnd $loc_redirect {
  1 @server1;
  2 @server1;
  ...
  8 @server2;
  9 @server2;
 10 @server2;
}

location / {
 recursive_error_pages on;
 error_page 403 = $loc_redirect;
 return 403;
}

Redirecionamentos:

location @server1 {
  internal;
  return 302 http://box11.example.com$request_uri;
}

location @server2 {
  internal;
  return 302 http://box11.example.com$request_uri;
}

Outra variante: use retornar 302 $ alguma_variavel; (e URLs completos no mapa) diretamente no local "/".

    
por 22.05.2014 / 08:18