Переменные среды Cloud Foundry не работают внутри nginx.conf

Я пытаюсь создать общий nginx.conf это делает proxy_pass в зависимости от окружающей среды.

Я использую приспособление из облачного литейного завода staticfile-buildpack

https://github.com/cloudfoundry/staticfile-buildpack/tree/master/fixtures/pushstate_and_proxy_pass/

Я хочу установить прокси-проход в зависимости от переменной среды.

Это код файла proxy.conf:

location /api { proxy_pass {{env "MY_DEV_PROXY"}}; }

Я ожидаю, что переменная среды MY_DEV_PROXY, которую я ранее установил, будет разрешена.

Вместо этого, когда я отправляю свое приложение в облачный литейный цех, я получаю:

ERR 2019/02/19 08:18:39 [emerg] 88 # 0: директива proxy_pass не заканчивается символом ";" в /home/vcap/app/nginx/conf/includes/proxy.conf:1

При использовании прямого значения вместо переменной:

location /api { proxy_pass https://my-dev-proxy.com; }

все отлично работает

cf curl /v2/info && cf version:

{ "description": "Cloud Foundry provided by Swisscom", "min_cli_version": "6.42.0", "min_recommended_cli_version": "latest", "api_version": "2.128.0", "osbapi_version": "2.14", }

cf version 6.42.0+0cba12168.2019-01-10

1 ответ

Если вы используете пакет сборки Nginx, вы можете использовать метод в документации для доступа к переменным среды.

location /api { proxy_pass {{env "MY_DEV_PROXY"}}; }

https://docs.cloudfoundry.org/buildpacks/nginx/


Если вы используете сборочный пакет Staticfile, вы не можете использовать ту же функцию из сборочного пакета Nginx (по крайней мере, на момент написания).

Сборочный пакет Staticfile автоматически генерирует большую часть / всю конфигурацию Nginx, поэтому вам технически не нужно вставлять переменные окружения. Однако вы можете включать пользовательские фрагменты Nginx в пакет компоновки Staticfile, поэтому разумно хотеть получить доступ к переменным окружения из этих фрагментов.

Если вы хотите сделать это, вам нужно сделать что-то вроде этого:

  1. Увидеть Custom Location инструкции здесь. Вам нужно будет установить альтернативу root а также location_include в Staticfile, Это будет ссылаться и инструктировать Nginx для обработки пользовательских настроек, которые вы предоставляете через приложение.

  2. Вместо указания пользовательских файлов конфигурации, укажите пользовательские erb скрипты. Пример: nginx/conf/includes/custom_header.conf.erb, Это должно содержать вашу конфигурацию в качестве шаблона, но вы можете ссылаться на переменные env, такие как <%= ENV["MY_VAR"] %>, Вы также можете сделать что-нибудь еще в шаблоне erb.

    location /api { proxy_pass <%= ENV["MY_DEV_PROXY"] %>; }
    
  3. Добавить .profile скрипт в корень вашего приложения. В этом скрипте вы будете использовать erb обработать файл шаблона и сгенерировать актуальную конфигурацию.

    erb nginx/conf/includes/custom_header.conf.erb > nginx/conf/includes/custom_header.conf
    

    Когда ваше приложение запустится, оно запустит этот скрипт и превратит ваш шаблон в настоящую пользовательскую конфигурацию. Затем Nginx загрузит пользовательский конфиг.

Надеюсь, это поможет!

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