Tengo un contenedor de Docker ejecutando Nginx, que se vincula a otro contenedor de Docker. El nombre de host y la dirección IP del segundo contenedor se cargan en el contenedor de Nginx como variables de entorno al iniciarse, pero antes de eso no se conocen (son dinámicas). Quiero que mi nginx.conf
use estos valores - por ejemplo,
upstream gunicorn {
servidor $APP_HOST_NAME:$APP_HOST_PORT;
}
¿Cómo puedo ingresar variables de entorno en la configuración de Nginx al iniciarse?
EDICIÓN 1
Este es todo el archivo, después de la respuesta sugerida a continuación:
env APP_WEB_1_PORT_5000_TCP_ADDR;
# Configuración de host de Nginx para la aplicación django_app
# La aplicación de Django es atendida por Gunicorn, funcionando bajo el puerto 5000 (a través de Foreman)
upstream gunicorn {
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
}
servidor {
escucha 80;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
ubicación /static/ {
alias /app/static/;
}
ubicación /media/ {
alias /app/media/;
}
ubicación / {
proxy_pass http://gunicorn;
}
}
Recargando nginx luego muestra errores:
$ nginx -s reload
nginx: [emerg] directiva desconocida "env" en /etc/nginx/sites-enabled/default:1
EDICIÓN 2: más detalles
Variables de entorno actuales
root@87ede56e0b11:/# env | grep APP_WEB_1
APP_WEB_1_NAME=/furious_turing/app_web_1
APP_WEB_1_PORT=tcp://172.17.0.63:5000
APP_WEB_1_PORT_5000_TCP=tcp://172.17.0.63:5000
APP_WEB_1_PORT_5000_TCP_PROTO=tcp
APP_WEB_1_PORT_5000_TCP_PORT=5000
APP_WEB_1_PORT_5000_TCP_ADDR=172.17.0.63
Archivo nginx.conf root:
root@87ede56e0b11:/# head /etc/nginx/nginx.conf
usuario www-data;
procesos_del_worker 4;
pid /var/run/nginx.pid;
env APP_WEB_1_PORT_5000_TCP_ADDR;
Configuración de nginx del sitio:
root@87ede56e0b11:/# head /etc/nginx/sites-available/default
# La aplicación de Django es atendida por Gunicorn, funcionando bajo el puerto 5000 (a través de Foreman)
upstream gunicorn {
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
}
servidor {
escucha 80;
Recargar configuración de nginx:
root@87ede56e0b11:/# nginx -s reload
nginx: [emerg] la directiva "server" no está terminada por ";" en /etc/nginx/sites-enabled/default:3
11 votos
Esta no es una solución genérica para variables de entorno, pero si desea usar variables de entorno para los nombres de host/direcciones IP de los servidores upstream, tenga en cuenta que Docker (al menos en versiones recientes) modifica /etc/hosts por usted. Consulte docs.docker.com/userguide/dockerlinks. Esto significa que si su contenedor vinculado se llama 'app_web_1', Docker creará una línea en /etc/hosts en su contenedor Nginx. Por lo tanto, simplemente puede reemplazar
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
conserver app_web_1:5000;
.1 votos
Gracias @mozz100 - eso es increíblemente útil - las entradas de /etc/hosts son mucho más efectivas que las variables de entorno en este caso. La única parte que falta es qué sucede si el contenedor upstream se reinicia y adquiere una nueva IP. ¿Presumo que los contenedores secundarios seguirán apuntando a la IP original, no a la nueva?
1 votos
Sí, si reinicias
app_web_1
obtendría una nueva dirección IP, por lo que también deberías reiniciar tu contenedor de nginx. Docker lo reiniciaría con un/etc/hosts
actualizado por lo que no necesitarías modificar el(los) archivo(s) de configuración de nginx.0 votos
Al leer las respuestas aquí, me quedo perplejo de que algo tan básico no haya sido implementado de manera elegante por probablemente el servidor web más popular del planeta.