How to combine try_files with multiple proxy destinations

I have the folllowing requirement:

  1. if /usr/share/nginx/html/maintenance.html exists, then always show
    this
    file to browser.
  2. if this is the static file which located in the sub-directories of
    /usr/share/nginx/html/, then show this static file to browser.
  3. if the URI begins with /testapp1/, then proxy to
    http://127.0.0.1:8080;
    else proxy to http://127.0.0.1:8081

And I tried the following two configurations but both failed:

  1. Config1
    server {

    root /usr/share/nginx/html/;
    location / {
    try_files /maintenance.html $uri @proxy;
    }

location @proxy {
location /testapp/ {
proxy_pass http://127.0.0.1:8080;
}

location / {
  proxy_pass http://127.0.0.1:8081
}

}
}

  1. Config2
    server {

    root /usr/share/nginx/html/;
    try_files /maintenance.html $uri @proxy;

location /testapp/ {
proxy_pass http://127.0.0.1:8080;
}

location / {
proxy_pass http://127.0.0.1:8081
}
}

For Config1, it throws the following error:
nginx: [emerg] location “/testapp/” cannot be inside the named location
@proxy” in /etc/nginx/nginx.conf:41

For Config2, it does not work as expected: it seems that when try_files
is
together with location directives, try_file has the lowerest priority
and so
I can never get /maintenance.html shown.

So can anybody know how to config to meet my requirement ? Thanks in
advance!

Posted at Nginx Forum:

On Wed, Jan 08, 2014 at 04:22:40AM -0500, rrrrcccc wrote:

Hi there,

(This is all untested, so handle with care.)

I have the folllowing requirement:

  1. if /usr/share/nginx/html/maintenance.html exists, then always show this
    file to browser.

That is probably best done with an “if” and a “return 503” – there are
a
few approaches you can take, with their own advantages and
disadvantages.

  1. if this is the static file which located in the sub-directories of
    /usr/share/nginx/html/, then show this static file to browser.
  2. if the URI begins with /testapp1/, then proxy to http://127.0.0.1:8080;
    else proxy to http://127.0.0.1:8081

You could use “error_page” for 404 here, following
http://ngnix.org/r/error_page.

But I’ll suggest using try_files with a named location as fallback.

Either way, you’ll probably want one prefix and one named location,
per set of urls.

Something like:

location ^~ / {
try_files $uri $uri/ @proxyslash;
}
location @proxyslash {
proxy_pass http://127.0.0.1:8080;
}
location ^~ /testapp1/ {
try_files $uri $uri/ @proxytestapp1;
}
location @proxytestapp1 {
proxy_pass http://127.0.0.1:8081;
}

f

Francis D. [email protected]