View Source MainProxy (main_proxy v0.3.2)

Route requests to other Phoenix Endpoints or Plugs with WebSocket support.

This library is useful for Gigalixir, Render, Heroku or other deployments where only one web port is exposed.

Installation

Add MainProxy to your list of dependencies in mix.exs.

If you are running an umbrella project, adding MainProxy as a dependency at the root mix.exs won't work. Instead, either add it to one of your child apps or create a new child app solely for the proxy.

def deps do
  [
    {:main_proxy, "~> 0.1"},
  ]
end

Usage

Configure listening options for MainProxy:

config :main_proxy,
  http: [port: 4080],
  https: [port: 4443]

Create a proxy module which configures backends:

defmodule MyApp.Proxy do
  use MainProxy.Proxy

  @impl MainProxy.Proxy
  def backends do
    [
      %{
        domain: "my-cool-app.com",
        phoenix_endpoint: MyAppWeb.Endpoint
      },
      %{
        domain: "members.my-cool-app.com",
        phoenix_endpoint: MyAppMembersWeb.Endpoint
      },
      %{
        verb: ~r/get/i,
        path: ~r{^/main-proxy-plug-test$},
        plug: MainProxy.Plug.Test,
        opts: [1, 2, 3]
      }
    ]
  end
end

Backends can also be configured via configuration:

config :main_proxy,
  http: [port: 4080],
  https: [port: 4443],
  backends: [
    # ...
  ]

But, it's not the recommended way.

Add above created proxy module to the supervision tree:

children = [
  # ... other children
  MyApp.Proxy,
]

Configure all endpoints to not start a server in order to avoid endpoints bypassing MainProxy:

# ...
config :my_app, MyAppWeb.Endpoint, server: false
config :my_app_members, MyAppMembersWeb.Endpoint, server: false

Available Configuration Options

  • :http - the configuration for the HTTP server. It accepts all options as defined by Plug.Cowboy.
  • :https - the configuration for the HTTPS server. It accepts all options as defined by Plug.Cowboy.
  • :server - true by default. If you are running application with mix phx.server, this option is ignored, and the server will always be started.
  • :backends - the rule for routing requests:
    • :domain
    • :verb
    • :host
    • :path
    • :phoenix_endpoint / :plug
    • :opts - only for :plug
  • :log_requests - true by default. Log the requests or not.