如何在Nginx.conf中使用环境变量

Modified on: Wed, 13 Nov 2019 21:00:03 +0800

[交发布,从https://stackoverflow.com/questions/21933955编辑了下来,因为它是对于StackOverflow来说太像sysadmin了。]

我有一个运行Nginx的docker容器,它链接到另一个docker容器。第二个容器的主机名和IP地址在启动时作为环境变量加载到Nginx容器中,但在此之前不知道(它是动态的)。我希望我的nginx.conf能够使用这些值 - 例如

upstream gunicorn {
    server $APP_HOST_NAME:$APP_HOST_PORT;
}

如何在启动时将环境变量导入Nginx配置?

编辑1

这是整个文件,在以下建议的答案之后:

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;
    }
}

重新加载nginx然后错误:

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

编辑2:更多详情

当前环境变量

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

Root 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;

网站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;

重新加载nginx配置:

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

最佳答案

如果您使用的是链接,则docker会设置环境变量,并在/etc/hosts中为链接容器添加别名。如果您能够对端口进行硬编码(或者只是端口80),您可以执行以下操作:

upstream gunicorn {
    server linked-hostname:5000;
}

该端口仅在环境变量中可用,该变量不能在upstream模块中使用,也不能在服务器或位置块中使用。它们只能在主配置中引用,这对您没有帮助。您可以使用包含Lua的openresty捆绑包来执行此操作。

如果您不想使用openresty / Lua,另一种选择是在容器启动时进行一些替换。您的docker run命令可以创建链接,然后运行执行适当替换的包装脚本:

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

作者:,Ben Whaley

相关问答

添加新评论