Estoy usando nginx / 0.7.68, ejecutándome en CentOS, con la siguiente configuración:
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
El proxy_pass
es un registro DNS cuya IP cambia con frecuencia. Nginx almacena en caché la dirección IP desactualizada, lo que resulta en una solicitud a la dirección IP incorrecta.
¿Cómo puedo evitar que nginx guarde en caché la dirección IP cuando está desactualizada?
Respuestas:
Es una pregunta intrigante y AFAIK que no va a funcionar bien. Puede intentar usar el módulo ascendente y usar las directivas para la conmutación por error para ver si funciona como un hack.
Edición de 2018: muchas cosas cambiaron. Verifique la respuesta de @ohaal para obtener información real sobre esto.
fuente
server
indicador ascendente especialresolve
que solo está disponible en la versión comercial (consulte nginx.org/en/docs/http/ngx_http_upstream_module.html#server )La respuesta aceptada no funcionó para mí en nginx / 1.4.2.
El uso de una variable
proxy_pass
fuerza la re-resolución de los nombres DNS porque NGINX trata las variables de manera diferente a la configuración estática. De la documentación de NGINXproxy_pass
:Por ejemplo:
Nota: DEBE estar disponible un configurador (es decir, el servidor de nombres que se utilizará) y configurado para que funcione (y las entradas dentro de un
/etc/hosts
archivo no se utilizarán en una búsqueda).Por defecto, la versión 1.1.9 o versiones posteriores de NGINX caché responde usando el valor TTL de una respuesta y un
valid
parámetro opcional permite que el tiempo de caché se anule:Antes de la versión 1.1.9, el ajuste del tiempo de almacenamiento en caché no era posible, y nginx siempre almacenaba en caché las respuestas durante 5 minutos. .
fuente
In such setup ip address of "foo.example.com" will be looked up dynamically and result will be cached for 5 minutes.
Lo agregué a la respuesta para mayor claridad.set
interiorlocation
no funciona correctamente. 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;
Hay información valiosa en el comentario de Gansbrest y la respuesta oficial.
Pero creo que es importante mencionar este artículo oficial de nginx, publicado en 2016, que explica claramente el comportamiento de nginx en este asunto y las posibles soluciones: https://www.nginx.com/blog/dns-service-discovery-nginx-plus / /
De hecho, tenemos que "Establecer el nombre de dominio en una variable" y usar la directiva de resolución .
sin embargo, el uso de una variable cambia el comportamiento de reescritura. Es posible que deba usar la directiva de reescritura, depende de su ubicación y de la configuración de proxy_pass.
PD: habría publicado un comentario pero aún no hay suficientes puntos ...
fuente
La respuesta de ohaal nos lleva a la mayoría de nosotros, pero hay un caso en el que el solucionador DNS no vive en 127.0.0.1 (por ejemplo, cuando se encuentra en un entorno contenedorizado especial)
En ese caso, es posible que desee cambiar la configuración de nginx
resolver ${DNS_SERVER};
. Luego, antes de comenzar nginx, ejecutefuente
He pirateado un script para ver una carpeta conf.d en sentido ascendente en busca de cambios dns y volver a cargar nginx tras la detección. Es un primer paso, y seguramente se puede mejorar (el próximo paso, usaré nginx -T para analizar específicamente las secuencias ascendentes. La misma idea podría usarse para las directivas proxy_pass):
fuente