如何在nginx.conf中引用OS环境变量

cao*_*ngk 8 nginx

在nginx.conf中.

设置一个变量通过后set $name value,我可以参考它像$name,

但是,当我导出OS环境变量时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%无效,我以前尝试过.

dav*_*djb 6

nginx 目前没有内置的在配置中引用其环境变量的能力。然而,最简单的解决方案是perl_set来自ngx_http_perl_module的指令,这是 nginx 的一个额外模块。官方 nginx 包动态构建 Perl 模块,因此这是确保您安装额外nginx-module-perl包的情况(或配置您的 nginx 自定义构建,如果这是您正在做的)。

配置如下所示:

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

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


cli*_*lls -1

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

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

我猜 env 无论如何都不是您真正需要的。如果您尝试将变量传递给您的应用程序,您应该使用 proxy_param 或 fastcgi_param (取决于您与上游的对话方式):

fastcgi_param MYVAR foo;
Run Code Online (Sandbox Code Playgroud)

  • 很好,但是如何从系统环境变量到配置文件,再到上游服务器? (5认同)