Shell nginx:使用环境变量

Shell nginx:使用环境变量,shell,nginx,proxy,environment-variables,docker,Shell,Nginx,Proxy,Environment Variables,Docker,我有以下场景:我定义了一个env变量$SOME_IP,并希望在nginx块中使用它。参考指令,我在nginx.conf文件中使用env指令,如下所示: user www-data; worker_processes 4; pid /run/nginx.pid; env SOME_IP; location / { proxy_pass http://$SOME_IP:8000; } 现在我想将变量用于代理\u过程。我试过如下方法: user www-data; worker_proc

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

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

env SOME_IP;
location / {
    proxy_pass http://$SOME_IP:8000;
}
现在我想将变量用于
代理\u过程
。我试过如下方法:

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

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

但是我最终得到了这个错误消息:
nginx:[emerg]未知的“some_ip”变量
正确的用法应该是
$some_ip\u from_env
,但是从nginx.conf设置的环境变量不能在服务器、位置或http块中使用


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

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

在我公司的博客上写到:

TL;博士:

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"}; }';
      ...
    }
  }
}
编辑:原始博客已死亡,使用NGINX Docker图像将链接更改为wayback机器缓存

在容器启动时对配置文件的模板应用
envsubt
<代码>envsubt包含在NGINX docker的官方图像中

环境变量以
$variable
${variable}
的形式引用

nginx.conf.template

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    server {
        listen       80;
        location / {
            access_log off;
            return 200 '${MESSAGE}';
            add_header Content-Type text/plain;
        }
    }
}
FROM nginx:1.17.8-alpine
COPY ./nginx.conf.template /nginx.conf.template
CMD ["/bin/sh" , "-c" , "envsubst < /nginx.conf.template > /etc/nginx/nginx.conf && exec nginx -g 'daemon off;'"]
Dockerfile

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    server {
        listen       80;
        location / {
            access_log off;
            return 200 '${MESSAGE}';
            add_header Content-Type text/plain;
        }
    }
}
FROM nginx:1.17.8-alpine
COPY ./nginx.conf.template /nginx.conf.template
CMD ["/bin/sh" , "-c" , "envsubst < /nginx.conf.template > /etc/nginx/nginx.conf && exec nginx -g 'daemon off;'"]
注意:如果配置模板包含不应替换的美元符号
$
,则将所有使用的变量列为
envsubst
的参数,以便仅替换这些变量。例如:

CMD ["/bin/sh" , "-c" , "envsubst '$USER_NAME $PASSWORD $KEY' < /nginx.conf.template > /etc/nginx/nginx.conf && exec nginx -g 'daemon off;'"]
CMD[“/bin/sh”、“-c”、“envsubt'$USER\u NAME$PASSWORD$KEY'/etc/nginx/nginx.conf&&exec nginx-g“守护进程关闭;”
供参考。在nginx配置中使用环境变量查找

在nginx配置中使用环境变量

nginx开箱即用,内部不支持环境变量 大多数配置块。但在以下情况下,可以使用envsubs作为解决方法: 在使用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;'"
web:
图片:nginx
卷数:
-./mysite.template:/etc/nginx/conf.d/mysite.template
端口:
- "8080:80"
环境:
-NGINX_HOST=foobar.com
-NGINX_端口=80
命令:/bin/bash-c“envsubst/etc/nginx/conf.d/default.conf&&exec nginx-g‘daemon off;’
然后,
mysite.template
文件可能包含变量引用,如 这:

listen${NGINX_PORT}


自从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

我在另一个帖子上找到了这个答案:

谢谢!但是没有选项在服务器块中使用
nginx.conf
中定义的变量吗?在服务器块中,可以使用语法
set$var“value”然后在整个配置中引用$var。但是你不能使用env vars。节省一些时间(上面需要自定义构建),你可以使用一个模板和一个名为envsubt的工具为docker做这件事,它可以工作,只需指定env vars,或者您可能会无意中删除nginx中的vars,例如,
$host
这是什么
\u来自_env
后缀??该链接似乎没有指向您可能希望它指向的位置:)在通过helm安装启动此配置时,是否有方法检查输出?@Kajsa您可能希望将该注释放入所以问题(使用适当的标签,如
helm
等)。它将获得更多的可视性,并有更多的机会被具有掌舵知识的人(我不是)回答。您还可以使用
envsubt
创建bash模板。这不需要docker或lua+perl(如本问题所述):值得一提的是:1)它使用模板文件2)模板文件应在
/etc/nginx/templates/
中创建,并带有定义的后缀3)在替换env VAR后,它会在
conf.d
中自动创建目标配置文件,而不带后缀(
conf.d/default.conf
对于本例)4)默认模板扩展是
。模板
5)在原始答案中可以找到更多:)它不是nginx本身的功能,而是它的官方docker容器的功能,描述见“在nginx配置中使用环境变量(1.19中新增)”一段