如何在 Nginx 配置中正确使用 ENV 变量?

如何在 Nginx 配置中正确使用 ENV 变量?

我想将RAILS_ENV环境变量传递给 nginx 并使用它来设置指令的值rails_env

我可以使用 LUA 模块从环境中读取变量的值:

location @app {
    set_by_lua $env_rails_env 'return os.getenv("RAILS_ENV")';
    return 200 'rails env is: ${env_rails_env}';
}

当我curl这样做时,我得到了正确的答案:

[jsosic@workstation ~]$ curl http://localhost:3005/
rails env is: development

但是,如果我想将其用作 nginx 指令的值:

location @app {
    set_by_lua $env_rails_env 'return os.getenv("RAILS_ENV")';
    rails_env         $env_rails_env;
    limit_req         zone=one burst=100;
    passenger_enabled on;
}

我收到以下日志:

Message from application: '${env_rails_env}' database is not configured.
Available: ["default", "development", "test", "production"] 

这可能吗?

答案1

经过一番调查后,似乎passenger_app_env(rails_env别名为) 不接受变量,而是将其视为文字。

https://github.com/phusion/passenger-docker/issues/28

因此,它不会$env_rails_env扩展到 lua 读取的内容$RAILS_ENV,而是被视为字符串$env_rails_env。这就是日志行报告的原因database not configured

此外,根据 nginx 问答,变量不应该在配置文件中使用:

“与普通的静态配置相比,“[变量]成本相当高。[A]宏扩展和“include”指令应该与例如 sed + make 或任何其他常见模板机制一起使用。“ http://nginx.org/en/docs/faq/variables_in_config.html

我最终使用的是envsubst(1)

相关内容