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

12

Eu tenho um proxy reverso nginx que solicita proxies de um ELB externo da amazon para ELBs internos.

Eu tenho 6 instâncias de back-end que lida com os pedidos. As configurações ativadas pelo site são assim, mas existem números de porta 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 24 horas, uma das configurações para de funcionar. Todos os outros proxies funcionam bem. Se eu reiniciar o nginx, todas as configurações funcionarão novamente. Não há nada no error.log, nada estranho no log de acesso, syslog ou dmesg.

Isso é algo conhecido? Fiz algo errado com minhas configurações de proxy? Existem outros registros nos quais posso procurar?

user202172
fonte

Respostas:

22

A resposta a esta pergunta é que os ELBs às vezes alteram os endereços IP e o nginx resolve o nome durante o início.

Para corrigir isso, sempre há um servidor DNS na sua VPC em 0,2. Portanto, se o CIDR de ip local for 10.0.0.0/16, o servidor DNS estará em 10.0.0.2.

Adicione isso à 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 a resolverá apenas uma vez. Portanto, 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;
    }
}
user202172
fonte
alguém sabe qual versão do nginx suporta variáveis ​​na configuração proxy_pass? eu estou tentando em pé de feijão elástica (nginx versão 1.6.2) e não quer aceitar a variável de qualquer maneira eu colocá-lo.
Stephen C
Obrigado por isso, está literalmente nos deixando loucos há cerca de um mês!
Jim.R
Este artigo sobre repetições do bloco nginx também ecoa essa configuração. nginx.com/blog/dns-service-discovery-nginx-plus
Morgan Christiansson
1

Se seu proxy_pass não passou diretamente para um URL, como mostra o exemplo ( http://amazonaws.com ), mas 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;
}

Então você ficará menos preocupado com uma das atualizações posteriores que falharão temporariamente. Porque todos eles estarão fazendo o mesmo trabalho. Se um não responder, o próximo será enviado por proxy para essa resposta. Paz de espírito.

O Nginx ignorará automaticamente uma máquina com falha por x segundos. Até você repará-lo ou até ele retornar por si só. ( http://wiki.nginx.org/HttpUpstreamModule )

Portanto, seja qual for o motivo de suas interrupções, distribuindo-as em um farm upstream, isso se converte em uma configuração mais fácil.

user18099
fonte
Obrigado pela sua resposta! O estranho é que eu posso fazer uma solicitação diretamente à instância de back-end, mas não através do nginx. Se eu apenas reiniciar o nginx, a solicitação será enviada novamente por proxy. Como isso já está no ambiente de produção, eu realmente quero descobrir por que uma das configurações parece estar "descarregada" ou como posso descobrir o que o nginx realmente faz nos bastidores.
user202172
Você pode querer procurar mais informações sobre o log do nginx. Esse é um problema em que alguém tentou, como você, descobrir mais sobre "problemas intermitentes [...] que eu estou executando proxy" stackoverflow.com/questions/9914792/… Ele descreve uma maneira de extrair logs mais relevantes. Espero que ajude.
user18099