Я хочу передать 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)
.