Skip to content

Instantly share code, notes, and snippets.

@ramontayag
Last active August 29, 2015 14:02
Show Gist options
  • Save ramontayag/ebc4ab5e443bcc5dc29e to your computer and use it in GitHub Desktop.
Save ramontayag/ebc4ab5e443bcc5dc29e to your computer and use it in GitHub Desktop.

Basis is Dokku:

upstream $APP {
  server 127.0.0.1:$PORT;
}

server {
  listen      [::]:80;
  listen      80;
  server_name $hostname;
  location    / {
    proxy_pass  http://$APP;
    proxy_http_version 1.1;
    proxy_set_header Upgrade \$http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host \$http_host;
    proxy_set_header X-Forwarded-Proto \$scheme;
    proxy_set_header X-Forwarded-For \$remote_addr;
    proxy_set_header X-Forwarded-Port \$server_port;
    proxy_set_header X-Request-Start \$msec;
  }
}

Sample lowest-level usage in gem:

upstream = NginxConfigMaker::Upstream.new(
  name: "app_123",
  host: "127.0.0.1",
  port: "12380",
)

server = NginxConfigMaker::Server.new(
  listen: ["[::]:80", "80"],
  server_name: "app_123",
  location: [
    "/",
    proxy: {
      pass: "http://app_123",
      http_version: "1.1",
      set_headers: {
        "Upgrade": "\$http_upgrade",
        "Connection": "upgrade",
        "Host": "\$http_host",
        "X-Forwarded-Proto": "\$scheme",
        "X-Forwarded-For": "\$remote_addr",
        "X-Forwarded-Port": "\$server_port",
        "X-Request-Start": "\$msec",
      }
    }
  ]
)

This will most likely be wrapped by a ruby script in AppExpress:

class GenerateNginxConfigFile

  def execute(opts={})
    app_name = opts.fetch(:app_name)
    host = opts.fetch(:host)
    port = opts.fetch(:port)

    upstream = NginxConfigMaker::Upstream.new(
      name: app_name,
      host: host,
      port: port,
    )

    server = NginxConfigMaker::Server.new(
      ...
    )

    [upstream, server].join("\n")
  end

end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment