Usando ip_hash em um servidor SINGLE upstream apenas no nginx

2

Estamos usando nginx para balanceamento de carga. Acabamos de colocar um novo servidor on-line com uma atualização massiva para nossa plataforma para testes antes de implementá-lo. Queremos ter certeza de que ele está funcionando, então temos pesos definidos para enviar cerca de 10% do tráfego para esse servidor.

O problema é que precisamos garantir que, se o usuário for o servidor desse servidor, ele sempre obterá esse servidor para sessões futuras. Isso é feito facilmente com ip_hash , mas o que realmente queremos é que os outros serviços usem uma estratégia round-robin, enquanto SOMENTE esse servidor usa ip_hash.

É algo assim possível? Aqui está o nosso upstream.conf

upstream apps  {
   ip_hash;
   server 10.134.13.38:80 weight=3; # app-00
   server 10.134.13.46:80 weight=3; # app-01
   server 10.134.24.30:80 weight=3; # app-02
   server 10.134.8.153:80 weight=1; # app-new-test
}
    
por JoshL 21.09.2017 / 22:29

2 respostas

2

Eu usaria a diretiva split_clients e definiria dois upstreams.

upstream apps {
   server 10.134.13.38:80; # app-00
   server 10.134.13.46:80; # app-01
   server 10.134.24.30:80; # app-02
}

upstream apps_new_test {
   server 10.134.8.153:80; # app-new-test
}

split_clients "${remote_addr}AAA" $upstream_app {
    10% apps_new_test;
    *   apps;
}

server {
    ...
    proxy_pass http://$upstream_app;
}
    
por 22.09.2017 / 11:20
0

Existe uma única política de distribuição de pedidos em uso para um único bloco upstream . Então, você não pode alcançar seu objetivo assim.

Você poderia tentar algo como atribuir um cookie para usuários que chegam ao servidor app-new-test . A atribuição do cookie seria feita pelo novo aplicativo em execução no servidor.

Em seguida, você testaria esse valor de cookie na regra server com if e, em seguida, usaria proxy_pass http://10.134.8.153; . Por exemplo:

server {
    if ($cookie_upstream = "app-test-new") {
        proxy_pass http://10.134.8.153;
    }
    proxy_pass http://apps;
}
    
por 21.09.2017 / 23:03