Получение Nginx для обслуживания статических файлов из нескольких источников


У меня есть конфигурация Nginx, которая отлично работает и правильно обслуживает статические файлы:

location /static/ {
    alias /tmp/static/;
    expires 30d;
    access_log off;
}
Но сейчас я хочу сделать следующее: если статический файл не существует в /tmp/static, Nginx ищет файл в /srv/www/site/static. Я не знаю, как этого достичь, я попробовал несколько вещей с try_files, но я не знаю, как правильно использовать его.
4 9

4 ответа:

Вы можете установить свой корень в общий префикс двух путей, которые вы хотите использовать (в данном случае это/), а затем просто указать остальные пути в try_files args:

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

Может показаться неудобным использовать root / в местоположении, но try_files гарантирует, что никакие файлы за пределами /tmp/static или /srv/www/site/static не будут обслуживаться.

Следующее должно сделать трюк:

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

См. http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files для документации и примеров использования try_files

Вы можете использовать именованное местоположение с "корнем" для обработки серии резервных местоположений. Обратите внимание, что вы не можете использовать "псевдоним" внутри именованного местоположения.

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

Похоже, что ваши потребности будут удовлетворены с помощью SlowFS Cache Module . Он кэширует статическое содержимое во временном каталоге, который предположительно хранится на более быстрых дисках, и управляет резервным вариантом для вас.