web-dev-qa-db-ja.com

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"] 

これは可能ですか?

1
Jakov Sosic

調査の結果、_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)を使用しています。

0
Jakov Sosic