如何在nginx.conf中引用操作系统环境变量

10

在nginx.conf中,通过set $name value设置一个变量后,就可以像$name一样引用它。

但是当我通过env name_from_env导出一个操作系统环境变量时, 例如https://nginx.org/en/docs/ngx_core_module.html#env所说的那样, 并且我确定name_from_env是有效的,并且是从nginx的父进程定义的。

但是,朋友们,如何引用它呢? $name_from_env或${name_from_env}或%name_from_env%都不起作用,这是我之前尝试过的。


或者像gcc的-D选项一样,只需将变量传递给nginx.conf即可。 - caoxingk
2个回答

6
nginx目前没有内置能力在配置中引用其环境变量。但最简单的解决方案是使用ngx_http_perl_module,这是nginx的一个额外模块,其中包含perl_set指令。官方的nginx打包动态构建Perl模块,因此您只需要确保安装了额外的nginx-module-perl软件包(或者如果您正在进行自定义构建,则需要进行相应的配置)。
配置如下:
# Make environment variable available
env NAME_FROM_ENV;
# Load dynamic module (if built with Perl as dynamic module; omit if static)
load_module modules/ngx_http_perl_module.so;

http {
    server {
        location / {
            # Use Lua to get get and set the variable
            perl_set $name_from_env 'sub { return $ENV{"NAME_FROM_ENV"}; }';
            ...
        }
    }
}

另请参阅https://docs.apitools.com/blog/2014/07/02/using-environment-variables-in-nginx-conf.html,了解如何使用Lua实现相同的功能。使用Lua需要第三方模块,并未随nginx的默认软件包一起提供。


-1

应该是 $name_from_env,就像任何其他的 Nginx 变量一样。

请注意,在您的配置文件中,env 只能用于主要部分,不能用于 http、server 或 location 块。

我猜测无论如何环境变量都不是您需要的东西。如果您想将变量传递给应用程序,应该使用 proxy_param 或 fastcgi_param(取决于您如何与上游进行通信):

fastcgi_param MYVAR foo;

5
好的,但是你如何从系统环境变量到配置文件再到上游服务器呢? - fideloper
我需要结合 fastcgi_paramload_module modules/ngx_http_perl_module.so;perl_set...,但是 perl_set 不在 location 中,而是与 server 处于同一级别。 - Shadi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接