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
したがって、luaが読み取った_$env_Rails_env
_の内容に_$Rails_ENV
_が展開される代わりに、文字列_$env_Rails_env
_として扱われます。これが、ログ行が_database not configured
_を報告している理由です。
また、nginxのQ&Aに従って、構成ファイルで変数を使用しないでください。
「[変数]は、単純な静的構成に比べてかなりコストがかかります。[A]マクロ展開と "include"ディレクティブは、[sed + makeやその他の一般的なテンプレートメカニズムなどで[使用]する必要があります。」 http://nginx.org/en/docs/faq/variables_in_config.html
結局、envsubst(1)
を使用しています。