Tengo un nginx central que responde en router.mydomain.com. Tiene algunos proxypasses a diferentes nginxes:
server { listen 8080; server_name nginx_server; port_in_redirect off; location / { root /html; index index.html index.htm; } location /site1/ { proxy_pass https://site1.mydomain.com; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } location /site2/ { proxy_pass https://site2.mydomain.com; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; }Ambos sitios son nginxes alojados en un entorno kubernetes.
Ahora, el problema es que, cada vez que implemento el sitio 1 o el sitio 2, en kubernetes la ruta se actualiza correctamente, por lo que si https://site1.mydomain.com apuntaba a una instancia particular de Docker # 1, y la nueva implementación es una instancia de Docker # 2, la url https://site1.mydomain.com , luego apunte a la instancia de Docker #2.
Todo esto funciona bien, pero router.mydomain.com sigue apuntando a la IP que se resolvió primero en la instancia n.º 1.
router ---> https://site1 ---> docker #1 (ip: 123.456.789) router ---> https://site1 ---> docker #1 (ip: 123.456.789) \--> docker #2 (ip: 234.567.890) router ---> https://site1 -X-> docker #1 (ip: 123.456.789) \--> docker #2 (ip: 234.567.890) router (still pointing to ip: 123.456.789) -X-> https://site1 ---> docker #2 (ip: 234.567.890)¿Cómo puedo hacer que nginx "avise" que el dns cambió? ¿Debo desactivar el almacenamiento en caché de dns por completo? ¿Puedo hacer nginx cache dns por menos tiempo? ¿Cómo?
nginx tiene su propio código de resolución sin bloqueo, pero para usarlo, debe especificar una directiva de resolver usando la resolución. Aquí puede encontrar algunos detalles técnicos de por qué los autores de nginx implementan dicho mecanismo. Puede usar su servidor de nombres local si tiene uno, o usar algo externo como el DNS público de Google (8.8.8.8, 8.8.4.4) o el DNS proporcionado por su ISP:
resolver 8.8.8.8;Puede especificar el tiempo de espera mientras los últimos nombres resueltos son válidos:
resolver 8.8.8.8 valid=30s;A menos que haga esto, nginx resolverá sus nombres de dominio desde el archivo de configuración solo una vez al inicio.
Para su caso, tiene sentido utilizar uno de los servidores de nombres autorizados para su dominio. Para obtener la lista de esos servidores, puede usar el siguiente comando:
nslookup -type=ns mydomain.comSu configuración final se verá algo así como
server { listen 8080; server_name nginx_server; port_in_redirect off; resolver <your_authoritative_name_server> valid=<timeout>; location / { root /html; index index.html index.htm; } location /site1/ { proxy_pass https://site1.mydomain.com; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } location /site2/ { proxy_pass https://site2.mydomain.com; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } }Como está trabajando con Docker, esta pregunta también puede ser de su interés: nginx en la ruta del proxy de Docker al subdominio