nginx:使用环境变量

sch*_*ing 20 shell proxy nginx environment-variables docker

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

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

env SOME_IP;
Run Code Online (Sandbox Code Playgroud)

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

location / {
    proxy_pass http://$SOME_IP:8000;
}
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ksa 36

使用 NGINX Docker 镜像

envsubst在容器启动时应用于配置文件的模板。envsubst包含在官方 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dockerfile

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;'"]
Run Code Online (Sandbox Code Playgroud)

构建并运行docker:

docker build -t foo .
docker run --rm -it --name foo -p 8080:80 -e MESSAGE="Hellou World" foo
Run Code Online (Sandbox Code Playgroud)

注意:如果配置模板包含$不应被替换的美元符号,则列出所有使用的变量作为参数,envsubst以便仅替换这些变量 。例如:

CMD ["/bin/sh" , "-c" , "envsubst '$USER_NAME $PASSWORD $KEY' < /nginx.conf.template > /etc/nginx/nginx.conf && exec nginx -g 'daemon off;'"]
Run Code Online (Sandbox Code Playgroud)

Nginx Docker 文档供参考。查找在 nginx 配置中使用环境变量

在 nginx 配置中使用环境变量

开箱即用的 nginx 不支持大多数配置块内的环境变量。但是,如果您需要在 nginx 启动之前动态生成 nginx 配置,可以使用 envsubst 作为一种解决方法。

这是一个使用 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;'"
Run Code Online (Sandbox Code Playgroud)

mysite.template然后该文件可能包含这样的变量引用:

listen ${NGINX_PORT};


kik*_*ito 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;
Run Code Online (Sandbox Code Playgroud)

然后:

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"}; }';
      ...
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:原始博客已死,更改链接到返回机器缓存


Ben*_*ley 9

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

如果使用openresty包(包括Lua),则可以使用环境变量.

  • 节省了一些时间(上面需要自定义构建),你可以使用一个模板和一个名为envsubst的工具http://serverfault.com/a/755541/116508为docker做了这个并且它可以工作,只需指定env vars或你可能会无意中消灭nginx中的变量,例如```$ host``` (2认同)

Ido*_*her 7

从 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
Run Code Online (Sandbox Code Playgroud)

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

  • 它不是 nginx 本身的功能,而是它的官方 docker 容器的功能,描述位于 https://hub.docker.com/_/nginx 的“在 nginx 配置中使用环境变量(1.19 中新增)”段落中 (7认同)
  • 值得一提的是:1) 它使用模板文件 2) 模板文件应该在 `/etc/nginx/templates/` 内创建并定义后缀 3) 替换环境变量后,它会自动在 `conf.d` 内创建目标配置文件。 d` 不带后缀(本例为 `conf.d/default.conf`) 4) 默认模板扩展名是 `.template` 5) 更多内容可以在原始答案中找到:) (3认同)
  • 我喜欢这个解决方案,但是它一开始并不起作用,尽管我遵循了@Hunter_71 的提示。这是因为 Docker 容器必须启动“docker-entrypoint.sh”脚本才能运行“envsubst”来执行实际的替换。我在 Dockerfile 中定义了一个“CMD”命令,这使得默认的“ENTRYPOINT”变得过时。删除我的 CMD 并将其放入我复制到“/docker-entrypoint.d/”目录的脚本中解决了该问题。该目录中的脚本由默认的“docker-entrypoint.sh”自动执行。 (2认同)