Nginx

如何在 Nginx 配置中正確使用 ENV 變數?

  • June 25, 2018

我想將RAILS_ENVenv 變數傳遞給 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"] 

這甚至可能嗎?

經過一番調查,似乎passenger_app_envrails_env別名為)不接受該變數,而是將其視為文字。

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

因此,不是$env_rails_env擴展為$RAILS_ENVlua 讀取的內容,而是將其視為 string $env_rails_env。這就是日誌行報告的原因database not configured

此外,根據 nginx 問答,不應在配置文件中使用變數:

"

$$ Variables $$與普通的靜態配置相比,成本相當高。 $$ A $$應使用宏擴展和“包含”指令$$ with $$ 例如 sed + make 或任何其他常見的模板機制。” http://nginx.org/en/docs/faq/variables_in_config.html

我最終使用的是envsubst(1).

引用自:https://serverfault.com/questions/909304