NGINX => serve several applications on a single host name with sub-uris

nginx

Solution

How about:

upstream nodejs {
    server 127.0.0.1:3001;
}

upstream rails {
    server 127.0.0.1:3002;
}

server {
    listen 80;  

    location /nodejs {
        proxy_pass         http://nodejs;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

    location /rails {
        proxy_pass         http://rails;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

}

or shortly:

server {   
    listen 80;     

    location /nodejs {
        proxy_pass         http://127.0.0.1:3001;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

    location /rails {
        proxy_pass         http://127.0.0.1:3002;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

}

?

Most of the proxy directives are optional (you probably just need `proxy_pass` and `proxy_redirect`) but useful.

Problem

I'd like to serve several applications from the same server, reversed-proxied through nginx. I'd like these applications to be available through a single domain name with sub-uris. e.g. `www.mydomain.com/nodejs` => caught by nginx listening to port 80 and served through to a node.js app running on port 3001 `www.mydomain.com/rails` => caught by nginx listening to port 80 and served through to a rails app running on port 3002 My first stab is to start with two upstreams: ``` # /etc/nginx/sites-available/mydomain.com upstream nodejs { server 127.0.0.1:3001; } upstream rails { server 127.0.0.1:3002; } server { listen 80 default deferred; # What do I put here so that # mydomain.com/nodejs is proxied to the nodejs upstream and # mydomain.com/rails is proxied to the rails upstream ??? } ``` Does anyone know this or point me in the right direction?

Original source