A Plug based, reverse proxy server written in Elixir.
Elixir
Switch branches/tags
Clone or download

README.md

ReverseProxy

Build Status Coverage Status

A Plug based, reverse proxy server.

ReverseProxy can act as a standalone service or as part of a plug pipeline in an existing application.

From Wikipedia:

In computer networks, a reverse proxy is a type of proxy server that retrieves resources on behalf of a client from one or more servers. These resources are then returned to the client as though they originated from the proxy server itself. While a forward proxy acts as an intermediary for its associated clients to contact any server, a reverse proxy acts as an intermediary for its associated servers to be contacted by any client.

Goals

  • Domain based proxying
  • Path based proxying
  • Proxy cache
  • SSL/TLS termination

Non-goals

  • Replace production reverse proxy solutions

Configuration

:upstreams

Upstream servers can be listed per-domain in the following forms:

  • List of remote nodes, e.g. ["http://host:4000", "http://host:4001"]
  • A {plug, options} tuple, useful for umbrella applications

Note: This structure may change in the future as the project progresses.

config :reverse_proxy,
  # ...
  upstreams: %{ "foobar.localhost" => ["http://www.example.com"],
                "api." => ["http://localhost:4000"],
                "slogsdon.com" => ["http://localhost:4001"] }

You might need to create foobar.localhost in/etc/hosts` and replace example.com with an actual site.

:cache

Enables the caching of the responses from the upstream server.

Note: This feature has not yet been built to completion. The current implementation treats all requests as hit misses.

config :reverse_proxy,
  # ...
  cache: false

Running

plug_adapter = Plug.Adapters.Cowboy
options = []
adapter_options = []

plug_adapter.http ReverseProxy.Router, options, adapter_options

Embedding

ReverseProxy can be embedded into an existing Plug application to proxy requests to required resources in cases where CORS or JSONP are unavailable.

Note: This feature has not been thoroughly flushed out, so it might not yet act as described.

The following code leverages Plug.Router.forward/2 to pass requests to the /google path to ReverseProxy:

defmodule PlugReverseProxy.Router do
  use Plug.Router

  plug :match
  plug :dispatch

  forward "/google", to: ReverseProxy, upstream: ["google.com"]
end

License

ReverseProxy is released under the MIT License.

See LICENSE for details.