2016-06-24 4 views
2

Позвольте мне быстро предисловие к этому, сказав, что я не администратор сервера, поэтому вполне возможно, что я могу задавать здесь «неправильные» вопросы.Изменение корневой директории nginx в указанное время


У меня есть ситуации, когда у нас есть домен, который будет обслуживать статические файлы (HTML, изображения и т.д.), которые настроены и построенными существующего, отдельного приложения. В определенные запланированные даты нам нужно, чтобы содержимое сайтов менялось на другой набор статических файлов.

Поскольку файлы будут подготовлены заранее, мне было интересно, возможно ли, что nginx сможет «переключить» корневой каталог, чтобы направлять трафик в соответствующее место на основе этих запланированных дат.

Так если бы ряд каталогов, может быть, как это:

  • /www.example.com-20160701000000/content/public
  • /www.example.com-20160708000000/content/public
  • /www.example.com-20160801120000/content/public

И тогда конфигурация будет сказать, что с 1 июля 2016 года 00: 00:00 до 7 июля 2016 года 23:59:59, сайт root для www.example.com будет /www.example.com-20160701000000/content/public и т. Д.

Некоторые другие вещи, которые я посмотрел на:

  • Некоторые формы промежуточного типа PHP, но я хочу, чтобы избежать этого для портативности.
  • SSI действительно не похоже на вариант. Похоже, что у меня будет один корневой каталог, а в index.html содержимое будет чем-то вроде <!--# include file="www.example.com-$datestamp/content/public/index.html" -->, но похоже, что мне нужно было сделать это для каждой страницы, может быть? Я также не уверен, как это будет работать, если имена страниц отличаются между версиями.
  • Задача cron или что-то еще, что либо перемещает файлы, либо редактирует файл в соответствующее время, это просто похоже на действительно плохую потенциальную точку отказа.

So tl; dr, может ли nginx каким-либо образом настроить корневые каталоги, которые активны для домена в разные запланированные моменты времени? Или есть лучший подход к этой проблеме, о которой я не знаю?

ответ

1

nginx имеет переменный, называемые $time_iso8601 и $time_local, которые можно использовать, чтобы построить динамический корень. См. this document.

Один из подходов состоит в том, чтобы построить ваши правила в качестве карты и установить директиву root соответствующим образом с использованием сопоставленной переменной или именованных захватов. См. this document.

Я тестировал концепцию с помощью этого:

map $time_iso8601 $root { 
    default   /usr/local/www/test; 
    ~^2016-06-2[0-9] /usr/local/www/test/test-20160625; 
} 

server { 
    root $root; 
    ... 
} 
+0

Это идеальное варианта: именно такого направления я надеялся. Спасибо! –