Назад | Перейти на главную страницу

Как правильно использовать переменные ENV в конфигурации Nginx?

Я хочу передать 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, он обрабатывается как строка $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).