GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo forzar a nginx a resolver DNS (de un nombre de host dinámico) cada vez que se hace proxy_pass?

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.


Linux
  1. Cómo usar Nginx para redirigir

  2. nginx - 413 Entidad de solicitud demasiado grande

  3. Cómo implementar un servidor DNS dinámico con Docker en Debian 10

  4. Cómo habilitar HTTP2 en NGINX

  5. ¿Cómo resolver un nombre de host en una dirección IP en un script Bash?

Cómo habilitar TLS 1.3 en Nginx

Cómo encontrar el nombre de host en Linux

¿Cómo habilitar IPv6 en Nginx?

¿Cómo instalar Nginx en CentOS 7?

Cómo instalar NGINX en Ubuntu 18.04

¿Cómo puedo resolver un nombre de host en una dirección IP en un script Bash?