nginx:使用环境变量

新手上路,请多包涵

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

 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

原文由 schickling 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.7k
2 个回答

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

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

原文由 Ben Whaley 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 NGINX Docker 镜像

在容器启动时在配置文件的模板上应用 envsubstenvsubst 包含在官方 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;
        }
    }
}

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;'"]

构建并运行 docker:

 docker build -t foo .
docker run --rm -it --name foo -p 8080:80 -e MESSAGE="Hellou World" foo

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

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

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;'"

mysite.template 文件可能包含如下变量引用:

listen ${NGINX_PORT} ;

原文由 Michal Foksa 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题