Setting up an Elixir/Phoenix app as a reverse proxy

I’m looking to set up an Elixir/Phoenix app in front of an existing application and have this app act as a queuing system during high load events. This is probably never going to see real-world action as I’m mostly looking to learn more about this side of things.

I’ve never created an application to act as a reverse proxy but it seems like something Elixir/Erlang would handle well. Is there a recommended way to handle this? Any packages/articles to handle this would be appreciated!

A reverse proxy behind apache/nginx is very common. I run a couple of deployments like this where I have a phoenix application mixed in among normal php apps.

For normal HTTP/HTTPs traffic I’ve used both apache and nginx but I had problems getting apache work with websockets (I did not spend too much time on it though).

In apache you need the following configuration:

<VirtualHost *:443>
   ...
   ProxyPass "/yourapp" http://127.0.0.1:4000/
   ProxyPassReverse "/yourapp" http://127.0.0.1:4000/
   ...
</VirtualHost>

And you need the apache mod_proxy module (mox_proxy_http mod_proxy_wstunnel)

For nginx this can be achieved with (and this includes web sockets):

server {
...
  
   location /yourapp { 
      ...
      proxy_http_version 1.1;
    
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-Cluster-Client-Ip $remote_addr;

      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_pass http://localhost:3000;
     ...
  }
}

You also need to configure your phoenix endpoint (https://hexdocs.pm/phoenix/Phoenix.Endpoint.html#module-endpoint-configuration)
Especially url: [host: "your.host.name", path: "/yourapp", port: 80]
The path is what you use in the ProxyPass directive and the port is the port apache/nginx is running on.

I wish I had saved the sources of this information, then you could read a bit more about it. I was certain that phoenix official documentation had a chapter on reverse proxy with nginx but couldn’t find it.

7 Likes

There is a “plug” you can use (middleware for the phoenix router pipeline) which can do this for you, see: https://github.com/tallarium/reverse_proxy_plug/blob/master/README.md

Have fun with it! :slight_smile: