Question

I have a Nginx config that works fine and serves static files properly:

location /static/ {
    alias /tmp/static/;
    expires 30d;
    access_log off;
}

But what I want to do now is that if the static file doesn't exist in /tmp/static, Nginx looks for the file in /srv/www/site/static. I am not sure how to achieve that, I have tried a few things with try_files, but I don't know how to properly use it.

Was it helpful?

Solution

You can set your root to the common prefix of the two paths you want to use (in this case, it's /), then just specify the rest of the paths in the try_files args:

location /static/ {
  root /;
  try_files /tmp$uri /srv/www/site$uri =404;
  expires 30d;
  access_log off;
}

It may seem disconcerting to use root / in a location, but the try_files will ensure that no files outside of /tmp/static or /srv/www/site/static will be served.

OTHER TIPS

the following should do the trick:

location /static/ {
  expires 30d;
  access_log off;
  try_files tmp/static/$uri tmp/static/$uri/ tmp/static2/$uri tmp/static2/$uri/;
}

see http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files for documentation and examples of try_files use

You can use a named location with "root" in order to process a series of fallback locations. Note that you cannot use "alias" inside a named location.

location / {
    root /path/to/primary/html;
    try_files $uri $uri/ @fallback;
}
location @fallback {
    root /path/to/secondary/html;
    try_files $uri $uri/ =404;
}

It appears that your needs would be served by using the SlowFS Cache Module. It caches your static content in a temporary directory that is presumably stored on faster disks, and manages the fallback for you.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top