Estou usando o nginx/0.7.68, rodando no CentOS, com a seguinte configuração:
server {
listen 80;
server_name ***;
index index.html index.htm index.php default.html default.htm default.php;
location / {
root /***;
proxy_pass http://***:8888;
index index.html index.htm;
}
# where *** is my variables
O proxy_pass
é para um registro DNS cujo IP muda com frequência. O Nginx armazena em cache o endereço IP desatualizado, resultando em uma solicitação para o endereço IP errado.
Como posso impedir que o nginx armazene em cache o endereço IP quando estiver desatualizado?
A resposta aceita não funcionou para mim no nginx/1.4.2.
O uso de uma variável
proxy_pass
força a re-resolução dos nomes DNS porque o NGINX trata as variáveis de maneira diferente da configuração estática. Da documentação do NGINXproxy_pass
:Por exemplo:
Nota: Um resolvedor (ou seja, o servidor de nomes a ser usado) DEVE estar disponível e configurado para que isso funcione (e as entradas dentro de um
/etc/hosts
arquivo não serão usadas em uma pesquisa).Por padrão, a versão 1.1.9 ou versões posteriores do cache do NGINX respondem usando o valor TTL de uma resposta e um
valid
parâmetro opcional permite que o tempo do cache seja substituído:Antes da versão 1.1.9, o ajuste do tempo de armazenamento em cache não era possível e o nginx sempre armazenava as respostas em cache por 5 minutos. .
Há informações valiosas no comentário do gansbrest e na resposta ohaal.
Mas acho importante mencionar este artigo oficial do nginx, publicado em 2016, explica claramente o comportamento do nginx sobre esse assunto e as possíveis soluções: https://www.nginx.com/blog/dns-service-discovery-nginx-plus /
Na verdade, temos que "Definir o nome de domínio em uma variável" e usar a diretiva resolver .
no entanto, o uso de uma variável altera o comportamento de reescrita. Você pode ter que usar a diretiva de reescrita, depende da sua localização e configuração do proxy_pass.
PS: teria postado um comentário, mas ainda não há pontos suficientes ...
a resposta de ohaal leva a maioria de nós até lá, mas há um caso em que o resolvedor de DNS não vive em 127.0.0.1 (por exemplo, quando você está em um ambiente em contêiner especial)
Nesse caso, você pode querer alterar o nginx conf para
resolver ${DNS_SERVER};
. Então, antes de iniciar o nginx, executeObserve que você precisa do
gettext
pacote instalado, pois ele fornece oenvsubst
comando.É uma pergunta intrigante e AFAIK que não vai funcionar bem. Você pode tentar usar o módulo upstream e usar as diretivas para failover para ver se funciona como um hack.
Edição de 2018: muitas coisas mudaram. Verifique a resposta de @ohaal para obter informações reais sobre isso.
Eu criei um script para assistir a upstreams de uma pasta conf.d para alterações de dns e recarregue o nginx após a detecção. É uma primeira passagem e certamente pode ser melhorada (na próxima passagem, usarei nginx -T para analisar upstreams especificamente. A mesma ideia pode ser usada para diretivas proxy_pass):
A resposta mais votada do @ohaal não funcionou para mim. Eu tive que usar uma variante da solução proposta:
Ao contrário da outra solução, isso também funciona para urls como:
Consulte https://stackoverflow.com/a/8130872/948938