nginx como balanceador de carga: ele pode retornar ao cliente para qual servidor de aplicativos a solicitação foi enviada?

4

A solução normal para isso é ajustar os próprios servidores de aplicativos para enviar sua identidade de volta em um cabeçalho http personalizado.

Estamos em uma situação especial, em que o servidor de aplicativos é um aplicativo codificado, e parece que não podemos obter uma nova versão dele para fazer isso. (No apache ou no iis seria fácil de resolver, basta adicionar o cabeçalho ao servidor web.)

Portanto, a questão é: o próprio nginx tem a funcionalidade de adicionar um cabeçalho à resposta que informa ao cliente qual servidor atendeu a solicitação?

Nota: Esta não é uma situação normal de "navegador para servidor web". Essa é uma parte personalizada do código do cliente (que temos origem e pode modificar) atingindo uma API REST em um servidor monolítico compilado (que não temos origem e não podemos modificar). O cliente precisa saber qual servidor foi atingido, mas NÃO precisa (ou deseja) ir para o mesmo servidor várias vezes (por exemplo, os cookies não são a resposta ... não há cookies). O cliente só precisa ver na resposta uma indicação de qual servidor atendeu a essa solicitação.

Nossa configuração do nginx está abaixo. Estamos executando a versão atual do GA. Atualmente, executamos o nginx apenas como um balanceador de carga e no Windows.

   upstream appserver {
       least_conn;
       server 192.168.104.53:1124;       // these are the IPs and ports of actual app servers
       server 192.168.104.51:1124;
       server 192.168.104.59:1124;
       }

   server {
       listen       80;                                    // this is where nginx listens
       server_name  localhost;
       #charset koi8-r;
       #access_log  logs/host.access.log  main;
       location / {
           proxy_pass http://appserver;
       }
    
por samsmith 30.09.2014 / 01:27

2 respostas

6

Eu acho que você está procurando pela variável $upstream_addr .

Ele conterá um dos 192.168.104.xx:1124 .

upstream appserver {
   least_conn;
   server 192.168.104.53:1124;
   server 192.168.104.51:1124;
   server 192.168.104.59:1124;
}

server {

   listen 80;
   server_name  localhost;

   location / {
       proxy_pass http://appserver;
       add_header "X-Upstream-Addr" $upstream_addr;
   }

}
    
por 30.09.2014 / 08:48
0

Sim, você usa a diretiva sticky . Por exemplo:

sticky cookie srv_id expires=1h domain=.example.com path=/;

Isso define um cookie no cliente e, na próxima hora, as solicitações subsequentes são enviadas ao servidor correto. Isso vai na diretiva upstream.

Fonte

    
por 30.09.2014 / 01:56

Tags