NginX maps for fun'n'profit
Suppose you have two or three different backends and wish to avoid a clumpsy solution defining every single location on what goes where. Let's say you have a main page with Django and some blog with WordPress.
Shortly I worked out an interisting solution to achieve it.
For the sake of example, let's assume you have two upstreams:
a django backend and a wordpress backend:
upstream django {
server 127.0.0.1:8000;
}
upstream wordpress {
server 127.0.0.1:9000;
}
Now, let's define a mapping on $uri to a named location:
map $uri $backend {
default @django;
~^/blog @wordpress;
~^/wp-admin @wordpress;
~^/wp-content @wordpress;
}
Finaly, in the main session, we simply define a try_files with a mapped
value istead of a named location as we would do it otherwise:
server {
server_name example.com;
# more stuff like root etc.
location / {
try_files $uri $backend;
}
location @django {
include proxy_params;
proxy_pass http://django;
}
location @wordpress {
include proxy_params;
proxy_pass http://wordpress;
}
}
That's all. The important part is a $backend variable. It decides
where the URI is routed to.