Phoenix behind a Nginx

Is it reasonable to put a Phoenix application behind a Nginx proxy? I’m going to use some Nginx futures in the future, but wondering if Nginx won’t affect to much to speed and concurrency of Phoenix app.

4 Likes

nginx works fantastically with Phoenix and I’ve seen no speed differences (except I have nginx host static files directly in some cases).

2 Likes

@OvermindDL1, thanks for the answer.

How about many concurent reuqests? Let’s say 50_000 websocket connections. Is Nginx fast enough for that?

@edit: Maybe cowboy is a production ready server and Nginx is no longer necessary for SSL configuration and other security stuff?

1 Like

I primarily use nginx as a front-end static-file cacher and proxy to the main server instance. On my 40k connection benchmark I saw no performance issue (honestly I could not tell nginx was there).

1 Like

@OvermindDL1 - Just a quick question. How are you serving static assets via nginx? What is your release process? Do you use exrm? If so, what is the root directory for your nginx server?

I serve static assets just with a few location directives in the nginx site file pointing to the various directories in the release that contain the /js/, /images/, /css/, and such directories.

I do use exrm right now, though I am highly looking forward at its replacement by the same author. It is hosted on Windows right now but transitioning to linux later. I do have a few smaller ones hosted myself via debian.

The ‘root’ path of the nginx site is directly routed to the erlang process, with a few location hooks before that directive that catch some early things like /js/, /images/, etc… It is not really any different from hosting other things behind nginx.

@OvermindDL1 - Thanks. The reason I ask about how you setup the root path on nginx with exrm is because exrm has release versions on the path - example, the following could be your root path - ./lib/myApp-0.0.1/priv/static. When you deploy your next version, it will be ./lib/myApp-0.0.2/priv/static with a different version in the path.

I was wondering if you have script to manage the new deployments without touching ngnix config - example: symlink to the currently deployed - ./lib/current/priv/static and if you do that, how would you handle hot deploy’s? Is that shell scripted as well?

All of this is just so I know I am not missing out on something that is much easier to do with exrm itself.

I just symlink it to a predefined location, not really ideal and I am sure there is a better way, but I’m lazy and its a single command. ^.^

@satb root value can contain variables, so you can set environment variable pointing at app location during deployment and access it using lua:

 location /images/ {
        set_by_lua $dynamic_root 'return os.getenv("MY_APP_ROOT")';
        root $dynamic_root/assets;
 }

However, you must restart the Nginx after each deployment.

A better solution is to copy static files to a fixed location (eg. /var/www/static). I’m using codeship and fabric to automate deployment tasks.

2 Likes

@pancake - Thank you. Both of them (lua scripts and codeship/fabric) are new that I didn’t know of before. I learn something new everyday thanks to folks like you that share.