Solución 1:
La respuesta aceptada no funcionó para mí en nginx/1.4.2.
Usando una variable en 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. Desde NGINX proxy_pass
documentación:
El valor del parámetro puede contener variables. En este caso, si se especifica una dirección como nombre de dominio, el nombre se busca entre los grupos de servidores descritos y, si no se encuentra, se determina mediante un resolver.
Por ejemplo:
server {
...
resolver 127.0.0.1;
set $backend "http://dynamic.example.com:80";
proxy_pass $backend;
...
}
Nota:Un resolver (es decir, el servidor de nombres a utilizar) DEBE estar disponible y configurado para que esto funcione (y las entradas dentro de un /etc/hosts
el archivo no se usará en una búsqueda).
De forma predeterminada, la versión 1.1.9 o versiones posteriores de la caché de NGINX responde utilizando el valor TTL de una respuesta y un valid
opcional. El parámetro permite anular el tiempo de caché:
resolver 127.0.0.1 [::1]:5353 valid=30s;
Antes de la versión 1.1.9, no era posible ajustar el tiempo de almacenamiento en caché y nginx siempre almacenaba en caché las respuestas durante 5 minutos. .
Solución 2:
Hay información valiosa en el comentario de gansbrest y en la respuesta de ohaal.
Pero creo que es importante mencionar este artículo oficial de nginx, publicado en 2016, explica claramente el comportamiento de nginx en este asunto y las posibles soluciones:https://www.nginx.com/blog/dns-service-discovery-nginx-plus //P>
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 configuración de proxy_pass.
PD:habría publicado un comentario pero aún no tengo suficientes puntos...
Solución 3:
Es una pregunta intrigante y AFAIK eso 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 truco.
Edición de 2018:muchas cosas cambiaron. Verifique la respuesta de @ohaal para obtener información real sobre esto.
Solución 4:
La respuesta de ohaal nos lleva a la mayoría de nosotros allí, pero hay un caso en el que la resolución de DNS no vive en 127.0.0.1 (por ejemplo, cuando estás en un entorno contenedor especial)
En ese caso, es posible que desee cambiar la configuración de nginx a resolver ${DNS_SERVER};
. Luego, antes de iniciar nginx, ejecute
export DNS_SERVER=$(cat /etc/resolv.conf |grep -i '^nameserver'|head -n1|cut -d ' ' -f2)
envsubst '${DNS_SERVER}' < your_nginx.conf.template > your_nginx.conf
Tenga en cuenta que necesita el gettext
paquete instalado, ya que proporciona el envsubst
comando.