Algumas configurações de proxy reverso nginx param de funcionar uma vez por dia

9

Eu tenho um proxy reverso nginx que faz proxy de solicitações de um ELB externo da amazon para ELBs internos.

Eu tenho 6 instâncias de back-end que lidam com as solicitações. As configurações ativadas pelo site se parecem com isso, mas existem números de portas e proxy_pass diferentes. Tudo o resto é idêntico:

server {
    listen 3000;
    location / {
            proxy_pass http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000;
            include /etc/nginx/proxy.conf;
    }

}

Uma vez a cada 24h, uma das configurações pára de funcionar. Todos os outros proxies funcionam bem. Se eu reiniciar o nginx, todas as configurações funcionarão novamente. Não há nada em error.log, nada de estranho no log de acesso, syslog ou dmesg.

Isso é algo conhecido? Eu fiz algo errado com minhas configurações de proxy? Existem outros logs que eu possa procurar?

    
por user202172 11.12.2013 / 11:44

2 respostas

16

A resposta a essa pergunta é que os ELBs às vezes alteram os endereços IP e o nginx faz o nome da resolução durante o início.

Para corrigir isso, existe sempre um servidor DNS no seu VPC em 0.2. Portanto, se o ip CIDR local for 10.0.0.0/16, o servidor DNS estará em 10.0.0.2.

Adicione isto à configuração do nginx.

resolver 10.0.0.2 valid=10s;

O proxy_pass também precisa ser definido como uma variável caso contrário, o nginx resolva apenas uma vez. Então, com base na configuração acima, esta é a configuração correta:

server {
    listen 3000;
    location / {
            resolver 10.0.0.2 valid=10s;
            set $backend "http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000"
            proxy_pass $backend;
            include /etc/nginx/proxy.conf;
    }
}
    
por 19.12.2013 / 16:56
1

Se o seu proxy_pass não passou diretamente para um URL como o seu exemplo mostra ( link ), mas sim para um farm upstream de proxy, como este:

upstream my_upstream {
 server1 127.0.0.1:1337;
 server2 127.0.0.1:1338; 
}
location / {
 proxy_pass         http://my_upstream;
}

Depois, você ficará menos preocupado com o fato de um dos fluxos ascendentes falhar temporariamente. Porque todos estarão fazendo o mesmo trabalho. Se alguém não responder, o próximo será representado por essa resposta. Paz de espírito.

O Nginx irá pular uma máquina com falha por x segundos automaticamente. Até você consertá-lo, ou até que ele retorne sozinho. ( link )

Assim, seja qual for a razão das suas interrupções, ao distribuí-las em um farm upstream, isso se converte em uma configuração mais fácil.

    
por 11.12.2013 / 12:55