Estou usando o nginx / 0.7.68, executando 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 frequentemente. O Nginx armazena em cache o endereço IP desatualizado, resultando em uma solicitação para o endereço IP incorreto.
Como posso parar o nginx de armazenar em cache o endereço IP, quando está desatualizado?
Respostas:
É uma pergunta intrigante e AFAIK que não vai funcionar bem. Você pode tentar usar o módulo upstream e usar as diretivas de failover para ver se ele funciona como um hack.
Edição de 2018: muitas coisas mudaram. Verifique a resposta de @ohaal para obter informações reais sobre isso.
fonte
server
bandeiraresolve
que só está disponível na versão comercial (ver nginx.org/en/docs/http/ngx_http_upstream_module.html#server )A resposta aceita não funcionou para mim no nginx / 1.4.2.
O uso de uma variável
proxy_pass
força a resolução dos nomes DNS, porque o NGINX trata as variáveis de maneira diferente da configuração estática. Na 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 posterior do NGINX armazena respostas 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 em cache as respostas por 5 minutos. .
fonte
In such setup ip address of "foo.example.com" will be looked up dynamically and result will be cached for 5 minutes.
Adicionei à resposta para maior clareza.set
interiorlocation
não funciona corretamente. CuidadoBy default, nginx caches answers using the TTL value of a response. An optional valid parameter allows overriding it: resolver 127.0.0.1 [::1]:5353 valid=30s;
resolver 127.0.0.11 [::1]:5353 valid=15s;
Há informações valiosas no comentário de gansbrest e na resposta ohaal.
Mas acho importante mencionar este artigo oficial do nginx, publicado em 2016, que 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 /
De fato, precisamos "Definir o nome do domínio em uma variável" e usar a diretiva resolvedor .
no entanto, o uso de uma variável altera o comportamento de reescrita. Talvez você precise usar a diretiva de reescrita, isso depende da sua localização e da configuração do proxy_pass.
PS: teria postado um comentário, mas ainda não há pontos suficientes ...
fonte
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, convém alterar o conf nginx para
resolver ${DNS_SERVER};
. Antes de iniciar o nginx, executefonte
Eu hackeei um script para assistir a um fluxo de pastas conf.d para alterações no DNS e recarregar o nginx após a detecção. É uma primeira passagem e certamente pode ser melhorada (na próxima passagem, usarei o nginx -T para analisar os fluxos de dados especificamente. A mesma idéia pode ser usada para as diretivas proxy_pass):
fonte