Nginx
如何在 Nginx 配置中正確使用 ENV 變數?
我想將
RAILS_ENV
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"]
這甚至可能嗎?
經過一番調查,似乎
passenger_app_env
(rails_env
別名為)不接受該變數,而是將其視為文字。https://github.com/phusion/passenger-docker/issues/28
因此,不是
$env_rails_env
擴展為$RAILS_ENV
lua 讀取的內容,而是將其視為 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)
.