我有以下场景:我定义了一个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
答案 0 :(得分:27)
您可以通过模块访问变量 - 我找到了使用Lua和Perl执行此操作的选项。
在我公司的博客上写到:
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不支持内部环境变量 大多数配置块。但是如果出现以下情况,可以将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