Getting Nginx to serve static files from several sources
-
30-06-2021 - |
Domanda
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.
Soluzione
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.
Altri suggerimenti
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.