nginx atualiza o IP do servidor upstream

2

Eu tenho uma configuração do Docker com um contêiner do Django e um nginx servindo arquivos estáticos. Eu tenho nginx configurado da maneira padrão:

upstream main_web {
    server web:8000;
}
server {
    location / {
        proxy_pass http://main_web;
        #...
    }

}

Eu uso a entrada /etc/hosts para obter o endereço IP do contêiner do Django.

Quando eu reinicio o contêiner do Django, seu endereço IP é atualizado, o que reflete para o arquivo hosts . Mas o nginx continua dando um erro 502 Bad Gateway . As coisas funcionam bem quando eu reinicio manualmente o nginx.

Não há uma maneira de dizer ao nginx para resolver o IP novamente se ele não estiver acessível?

    
por user1496984 15.09.2015 / 15:21

2 respostas

0

Veja: link para obter um método para obter o nginx para resolver novamente o IP usando uma variável no configuração proxy_pass.

Também é possível com o ha_proxy 1.6 com o recurso 'Resolução de IP do servidor usando o DNS em tempo de execução'.

    
por 20.04.2016 / 14:32
0

Quando você usa uma variável para especificar o nome do domínio na diretiva proxy_pass , o NGINX resolve novamente o nome do domínio quando o TTL expira . Você deve incluir a diretiva do resolvedor para especificar explicitamente o servidor de nomes (o NGINX não se refere ao /etc/resolv.conf ). Mais aqui

Usando o Docker, você pode verificar seu resolvedor de dns atual e adicioná-lo à sua configuração nginx. Verifique /etc/resolv.conf .

Por exemplo, usando o docker-compose, você pode definir o nome do serviço em sua configuração nginx vhost. Asume temos essa configuração:

docker-compose.yml

version: "3"
services:
  my-backend-service: # we will use this name in our nginx vhost conf
    image: some-image
  lb:
    image: nginx
    volumes:
      - ".docker/etc/nginx/default.conf:/etc/nginx/conf.d/default.conf"
    ports:
      - 80:80

Algumas coisas sobre a configuração acima, observe que não adiciono um nome de contêiner ao serviço de back-end, para que eu possa escalá-lo livremente. Também preste atenção ao nome do serviço, vamos usar isso no Nginx vhost conf para que resolva as instâncias ip via DNS. Finalmente, o Nginx está escutando na porta 80 e os serviços de backend estão escutando em 8080 (como um exemplo, pode ser qualquer coisa)

default.conf

resolver 127.0.0.11 valid=10s; # 127.0.0.1 comes from /etc/resolv.conf on the nginx container

server {
    location / {
        set $backend_servers my-backend-service;
        proxy_pass http://$backend_servers:8080;
    }
}

Para testar isso:

  • docker-compose up -d
  • escala docker-compose my-backend-service = 5
  • logs do docker-compose -f my-backend-service

Agora, você pode começar a fazer solicitações para localhost e o Nginx usará o resolvedor de DNS especificado para obter os endereços IP dos serviços de back-end e resolverá novamente o nome do domínio quando o TTL expirar.

    
por 15.06.2018 / 09:56

Tags