Packages
PhoenixReverseProxy is a high-performance reverse proxy solution for Phoenix. Utilizing the BEAM and pattern matching, it routes requests efficiently and handles reverse domain matching and WebSockets seamlessly. The best solution for Phoenix web apps that require a reverse proxy.
Current section
Files
Jump to
Current section
Files
phoenix_reverse_proxy
README.md
README.md
# PhoenixReverseProxy
**Share a port between many Phoenix apps in an umbrella or multiple endpoints in a single app**
## Setup
This library offers all the essentials for directing requests and websockets
from a single proxy application to your umbrella (or a standard Elixir app
with various endpoints). It enables you to run multiple Phoenix applications
within the same umbrella using the same port or have multiple endpoints
within a single app.
Start by creating a Phoenix application in your umbrella `apps` folder:
```bash
(cd apps && mix phx.new --no-webpack --no-ecto --no-html --no-gettext --no-dashboard reverse_proxy)
# Optionally you can delete unused files
rm -rf apps/reverse_proxy/lib/reverse_proxy_web/{channels,controllers,views}
```
If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `phoenix_reverse_proxy` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:phoenix_reverse_proxy, "~> 1.1.0"}
]
end
```
In `apps/reverse_proxy/lib/reverse_proxy_web/endpoint.ex` replace the contents with
this and replace the default endpoint and add appropriate endpoints:
```elixir
defmodule ReverseProxyWeb.Endpoint do
use PhoenixReverseProxy, otp_app: :reverse_proxy
# IMPORTANT: All of these macros except for proxy_default/1
# can take a path prefix so they all have an arity
# of 2 and 3.
# Maps to http(s)://api.example.com/v1
proxy("api.example.com", "v1", ExampleApiV1.Endpoint)
# Maps to http(s)://api.example.com/v2
proxy("api.example.com", "v2", ExampleApiV2.Endpoint)
# Matches the domain only and no subdomains
proxy("example.com", ExampleWeb.Endpoint)
# Matched any subdomain such as http(s)://images.example.com/
# but not the domain itself http(s)://example.com/
proxy_subdomains("example.com", ExampleSubs.Endpoint)
# Matches all subdomains and the domain itself.
# This is equivalent to combining these rules:
# proxy("foofoovalve.com", FoofooValve.Endpoint)
# proxy_subdomains("foofoovalve.com", FoofooValve.Endpoint)
proxy_all("foofoovalve.com", FoofooValve.Endpoint)
# Matches anything not matched above
proxy_default(ExampleWeb.Endpoint)
end
```
In your config you must disable your other Phoenix applications from
listening on TCP ports. In your current endpoint configuration make the
following modifications.
```elixir
# Configures the endpoint
config :example_web, ExampleWeb.Endpoint,
# Add this
server: false,
# Remove this and add it to the proxy endpoint configuration
http: [port: System.get_env("PHX_PORT") || 4000],
...
```
Move contents of the files `apps/reverse_proxy/config/*.exs` to the
corresponding `config/*.exs` config files.
Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/phoenix_reverse_proxy](https://hexdocs.pm/phoenix_reverse_proxy).