slogsdon / elixir-reverse-proxy

A Plug based, reverse proxy server written in Elixir.
https://hex.pm/packages/reverse_proxy
MIT License
147 stars 34 forks source link

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

Non-goals

Configuration

:upstreams

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

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.