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'.
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?
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'.
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:
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.