154 votos

¿Cómo puedo usar las variables de entorno en Nginx.conf

[Publicado y editado abajo de http://stackoverflow.com/questions/21933955 como se consideró que era demasiado sysadmin como StackOverflow.]

Tengo una ventana acoplable contenedor de ejecución de Nginx, que enlaza a otra ventana acoplable contenedor. El nombre de host y la dirección IP del segundo contenedor es cargado en el Nginx contenedor como variables de entorno en el inicio, pero es que no sabía antes (dinámico). Quiero que mi nginx.conf el uso de estos valores - por ejemplo,

upstream gunicorn {
    server $APP_HOST_NAME:$APP_HOST_PORT;
}

¿Cómo puedo obtener las variables de entorno en la configuración de Nginx en el inicio?

EDICIÓN 1

Este es el archivo completo, después de la respuesta sugerida a continuación:

env APP_WEB_1_PORT_5000_TCP_ADDR;
# Nginx host configuration for django_app

# Django app is served by Gunicorn, running under port 5000 (via Foreman)
upstream gunicorn {
    server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
}

server {
    listen 80;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /static/ {
        alias /app/static/;
    }
    location /media/ {
        alias /app/media/;
    }
    location / {
        proxy_pass http://gunicorn;
    }
}

La recarga de nginx, a continuación, los errores:

$ nginx -s reload
nginx: [emerg] unknown directive "env" in /etc/nginx/sites-enabled/default:1

EDIT 2: más detalles

Las 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

Raíz nginx.conf:

root@87ede56e0b11:/# head /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
env APP_WEB_1_PORT_5000_TCP_ADDR;

Sitio de la configuración de nginx:

root@87ede56e0b11:/# head /etc/nginx/sites-available/default
# Django app is served by Gunicorn, running under port 5000 (via Foreman)
upstream gunicorn {
    server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
}

server {
    listen 80;

Volver a cargar la configuración de nginx:

root@87ede56e0b11:/# nginx -s reload
nginx: [emerg] directive "server" is not terminated by ";" in /etc/nginx/sites-enabled/default:3

58voto

Ben Whaley Puntos 309

Las variables de entorno no puede ser utilizado en la upstream módulo, ni en el servidor o ubicación de los bloques. Sólo pueden ser referenciadas en la configuración principal, que no te ayuda. Usted puede hacer esto con el openresty paquete que incluye Lua.

Si usted no desea utilizar openresty/Lua, la única solución es hacer un poco de sustitución en el contenedor de inicio. Su docker run comando puede crear el enlace, a continuación, ejecute un contenedor de secuencia de comandos que realiza la sustitución adecuada:

#!/bin/bash
/usr/bin/sed -i "s/server<gunicorn_server_placeholder>/${APP_WEB_1_PORT_5000_TCP_ADDR}/" default
start nginx

14voto

yawn Puntos 121

Escribí algo que puede o no ser útil: https://github.com/yawn/envplate

En línea edita archivos de configuración con ${clave} referencias a variables de entorno, opcionalmente, crear copias de seguridad de registro de lo que hace. Está escrito en el Ir y el resultado de la estática binario, puede ser descargado desde la lengüeta de liberación para Linux y MacOS.

5voto

Sabith K S Puntos 1

Yo lo que hice fue utilizar la erb!

cat nginx.conf  | grep -i error_log

error_log <%= ENV["APP_ROOT"] %>/nginx/logs/error.log;

--Después de usar erb

export APP_ROOT=/tmp

erb nginx.conf  | grep -i error_log

error_log /tmp/nginx/logs/error.log;

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: