Как правильно использовать переменные 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"]
Это вообще возможно?
1 ответ
После некоторого расследования кажется, что passenger_app_env
(который rails_env
имеет псевдоним) не принимает переменную и вместо этого рассматривает ее как литерал.
https://github.com/phusion/passenger-docker/issues/28
Итак, вместо $env_rails_env
расширяясь до содержания $RAILS_ENV
читать Луа, это рассматривается как строка $env_rails_env
, Вот почему строка журнала сообщает database not configured
,
Кроме того, в соответствии с вопросами и ответами nginx, переменные не должны использоваться в файлах конфигурации:
"[Переменные] довольно дороги по сравнению с простой статической конфигурацией. Расширение макроса [A] и директивы include должны использоваться [например, с sed + make или любым другим общим механизмом шаблонов". http://nginx.org/en/docs/faq/variables_in_config.html
То, что я в конечном итоге использует envsubst(1)
,