/master_proxy

Primary LanguageElixirMIT LicenseMIT

MasterProxy

Proxies requests to Web apps that are part of the platform. Useful for Gigalixir or Heroku deployment when just one web port is exposed.

Works with phoenix endpoints, plugs, and websockets.

This application is based on the master_proxy application inside the acme_bank project, which was based on a gist shared by @Gazler.

Installation

Add master_proxy to your list of dependencies in mix.exs:

def deps do
  [
    {:master_proxy, "~> 0.1.0"}
  ]
end

Configure how master_proxy should route requests by adding something like this in config.exs.

config :master_proxy, 
  # any cowboy options are allowed 
  http: [:inet6, port: 4080],
  https: [:inet6, port: 4443],
  backends: [
    %{
      host: ~r/localhost/,
      phoenix_endpoint: MyAppWeb.Endpoint
    },
    %{
      verb: ~r/get/i,
      path: ~r{^/master-proxy-plug-test$},
      plug: MasterProxy.Plug.Test,
      opts: [1, 2, 3]
    }
  ]

How does this work?

  1. We start a cowboy server with a single dispatch handler: MasterProxy.Cowboy2Handler
  2. The handler looks at the verb, host, and path and compares it to the configuration you supplied to decide where to route the request a. If the backend that matched is a phoenix_endpoint it delegates to the Phoenix.Endpoint.Cowboy2Handler with your app's Endpoint b. If the backend that matched is a plug, then it just calls the plug as normal

Development

mix run --no-halt
curl -i foo.com.127.0.0.1.xip.io:4080 
curl -i localhost:4080