How to tell Phoenix not to handle the assets if I'm using nginx for that?

I want Phoenix to not handle the assets at all in production. How to set it up in such a way?

What we usually do is to serve Phoenix behind Nginx (so inside your Nginx configuration you check for the domain name and forward certain calls to phoenix), and make this call conditional depending on if the call corresponds to a path in the priv/static folder.

So we do not tell Phoenix to not handle those (and as a matter of fact, in the development environment it still will) but those requests will simply be handled by Nginx directly and Phoenix will never see them.

I don’t have an example config snippet for you now unfortunately since I am on my phone, but I hope the gist is clear even without it :slight_smile: .

2 Likes

Look for plug Plug.Static calls in your endpoint, you can adjust or disable them.

1 Like

2 different answers, which one is correct?

First - you don’t have to do anything other than setup nginx properly
Second - you first have to setup Phoenix correctly

If you don’t want phoenix to handle those requests just don’t send them to the phoenix server. I usually have an nginx config which looks like below:

server{
  server_name awesome.com;
  root /opt/www/awesome/path/to/static/assets;

  location / {
    try_files $uri @proxy;
  }

  location @proxy{
    proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_set_header  Host             $http_host;
    proxy_set_header X_FORWARDED_PROTO $scheme;

    proxy_redirect off;
    proxy_pass http://localhost:4000;

    gzip_proxied any;

  }
}

With this nginx will respond if it finds the asset and fallback to cowboy if it doesn’t find the static file.

2 Likes

Both. If you don’t send requests of static assets to phoenix in the first place it does not serve them. But if you want to make sure phoenix does not serve any assets no matter what (e.g. nginx being misconfigured) you’d want to disable Plug.Static.

4 Likes

As @LostKobrakai already pointed out, both are “correct”.

They are different strategies with the same goal. But to be honest, you need to make sure that your upstream reverse or HA proxy or even CDN is set up properly anyway, or you won’t have your assets at all.

Personally I’d just put the reverse proxy in front and leave phoenix untouched. This way there is a fallback available when the reverse proxy is failing parts of its job.

If though you still want to completely disable the delivery of statics in phoenix you can do it roughly like this:

unless Mix.env() in [:prod] do
  plug Plug.Static, …
end

You can find the original Plug.Static line in your projects endpoint.

Be aware though, that in case of a misbehaving reverse proxy the requests will now reach your applications router and be resolved by that. This might or might not be what you want in case of cases.

2 Likes

If you’re using releases, you’ll have to symlink to the release dir, since that will end up changing on every version bump.

Here’s how to do it with edeliver

1 Like