Shell nginx:使用环境变量
我有以下场景:我定义了一个env变量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
$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中新增)”一段