nginx:使用环境变量

时间:2014-02-18 22:05:57

标签: shell nginx proxy environment-variables docker

我有以下场景:我定义了一个env变量$SOME_IP,并希望在nginx块中使用它。参考nginx documentation我在env文件中使用nginx.conf指令,如下所示:

user www-data;
worker_processes 4;
pid /run/nginx.pid;

env SOME_IP;

现在我想将变量用于proxy_pass。我尝试过如下:

location / {
    proxy_pass http://$SOME_IP:8000;
}

但我最终收到此错误消息:nginx: [emerg] unknown "some_ip" variable

4 个答案:

答案 0 :(得分:27)

您可以通过模块访问变量 - 我找到了使用Lua和Perl执行此操作的选项。

在我公司的博客上写到:

https://web.archive.org/web/20170712003702/https://docs.apitools.com/blog/2014/07/02/using-environment-variables-in-nginx-conf.html

TL; DR:

env API_KEY;

然后:

http {
...
  server {
    location / {
      # set var using Lua
      set_by_lua $api_key 'return os.getenv("API_KEY")';

      # set var using perl
      perl_set $api_key 'sub { return $ENV{"API_KEY"}; }';
      ...
    }
  }
}
编辑:原来的博客已经死了,改变了对返回机器缓存的链接

答案 1 :(得分:7)

正确的用法是$SOME_IP_from_env,但是从nginx.conf设置的环境变量不能用于服务器,位置或http块。

如果您使用包含Lua的openresty bundle,则可以使用环境变量。

答案 2 :(得分:6)

创建配置模板,并在容器启动时对其应用envsubst

envsubst包含在NGINX官方Docker映像中。在Nginx Docker docs

中的在nginx配置中使用环境变量
  

在nginx配置中使用环境变量

     

开箱即用,nginx不支持内部环境变量   大多数配置块。但是如果出现以下情况,可以将envsubst用作解决方法   您需要在nginx之前动态生成nginx配置   开始。

     

以下是使用docker-compose.yml的示例:

web:
  image: nginx
  volumes:
    - ./mysite.template:/etc/nginx/conf.d/mysite.template
  ports:
    - "8080:80"
  environment:
    - NGINX_HOST=foobar.com
    - NGINX_PORT=80
  command: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
     

mysite.template文件随后可能包含变量引用,例如   这个:

     

listen ${NGINX_PORT};

答案 3 :(得分:3)

从nginx 1.19开始,您现在可以在配置中使用带有docker-compose的环境变量。我使用了以下设置:

# file: docker/nginx/templates/default.conf.conf
upstream api-upstream {
    server ${API_HOST};
}


# file: docker-compose.yml
services:
    nginx:
        image: nginx:1.19-alpine
        environment:
            NGINX_ENVSUBST_TEMPLATE_SUFFIX: ".conf"
            API_HOST: api.example.com

我在其他线程上找到了这个答案:https://stackoverflow.com/a/62844707/4479861