0
votes

I am trying to create a generic nginx.conf that does a proxy_pass depending on the environment.

I am using fixture from cloud foundry staticfile-buildpack

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

I want to set a proxy pass depending on the environment variable.

This is the code of the proxy.conf:

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

I expect that MY_DEV_PROXY environment variable that I have previously set is resolved.

Instead, when pushing my app to cloud foundry I get:

ERR 2019/02/19 08:18:39 [emerg] 88#0: directive "proxy_pass" is not terminated by ";" in /home/vcap/app/nginx/conf/includes/proxy.conf:1

When using a direct value instead of a variable:

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

everything works fine.

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
I expect that MY_DEV_PROXY environment variable that I have previously set is resolved. -> How are you setting the environment variable? Nginx doesn't substitute the variables, but the Nginx buildpack will. It only does that during staging. Are you setting the variable so that it's set during staging when the Nginx buildpack runs? docs.cloudfoundry.org/buildpacks/nginx/#env - Daniel Mikusa
@DanielMikusa I am setting my env variable through manifest.yml file. - alexv
What do you see if you run cf env <app>? - Daniel Mikusa
I see MY_DEV_PROXY under User-Provided variables. Also, I have seen reported bug link that is similar to this, and even if it is closed, the bug probably exists. - alexv
One more question, which buildpack are you using? Nginx or Staticfile? I don't think Staticfile does env variable substitution, at least in the way you're trying above. According to the docs, it's Nginx buildpack which offers that feature. I think you could make it work with Staticfile buildpack, but it'd be a little different. - Daniel Mikusa

1 Answers

1
votes

If you're using the Nginx buildpack, you can use the method in the docs for accessing environment variables.

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

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


If you're using the Staticfile buildpack, you cannot use the same feature from the Nginx buildpack (at least at the time of writing).

The Staticfile buildpack generates most/all of the Nginx config automatically for you, so you technically shouldn't need to insert any environment variables. However, you can include custom Nginx snippets with the Staticfile buildpack, so it's reasonable to want to access environment variables from those snippets.

If you want to do that, you'd need to do something like this:

  1. See the Custom Location instructions here. You'll need to set an alternative root and location_include in Staticfile. This will reference and instruct Nginx to process custom config that you supply through the app.

  2. Instead of specifying custom config files, specify custom erb scripts. Ex: nginx/conf/includes/custom_header.conf.erb. This should contain your config as a template, but you can reference env variables like <%= ENV["MY_VAR"] %>. You can also do anything else valid in an erb template.

    location /api { proxy_pass <%= ENV["MY_DEV_PROXY"] %>; }
    
  3. Add a .profile script to the root of your application. In this script, you'll use erb to process your template file and generate the actual configuration.

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

    When your app starts, it will run this script and turn your template into an actual custom config. Nginx will then load the custom config.

Hope that helps!