Как правильно использовать переменные 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),

Другие вопросы по тегам