Обработка различных статических файлов между средами при развертывании обновлений на основных/резервных серверах Django.

Я следую ответу Кена Кокрана на вопрос Простое развертывание Django на одном сервере. По сути, я использую два рабочих сервера, один primary и один fallback, и мой nginx настроен следующим образом (опуская ненужные детали):

upstream app-primary {
    server localhost:12345;
    server localhost:12346 backup;
}
server {
    root /home/fraxtil/app/primary;
    location /static/ {
        alias /home/fraxtil/app/primary/static/;
    }
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app-primary;
    }
}

При отправке обновления я обновляю fallback, затем выключаю primary, обновляю его и снова включаю. Решение почти идеальное, но есть одна проблема: я использую django-compressor для сбора и сжатия файлов CSS и JS, и не гарантируется, что эти два экземпляра будут иметь одинаковые статические имена файлов. Таким образом, пока primary не работает, сервер fallback прекрасно обрабатывает запросы приложений, но nginx ищет статические файлы в /.../primary/static/ вместо /.../fallback/static/.

Есть ли способ решить эту проблему без маршрутизации запросов статических файлов через Django? В качестве альтернативы, есть ли лучший способ беспрепятственного развертывания обновлений Django? (Я заинтересован в нулевом времени простоя, поэтому меня привлекла модель с двумя серверами.)


person ashastral    schedule 22.06.2013    source источник


Ответы (1)


Я нашел способ заставить его работать с помощью директивы try_files. На самом деле я пробовал это, прежде чем публиковать вопрос, но по какой-то причине моя первая попытка делала каждый запрос 404. Это, похоже, работает:

server {
    # Moved the root up one level
    root /home/fraxtil/app;
    location /static/ {
        # Try the primary instance's static folder, then the fallback's
        try_files /primary/$uri /fallback/$uri =404;
    }
...

Единственным недостатком здесь является то, что все запросы на несуществующие статические файлы будут попадать на диск дважды, но это не должно быть слишком большой проблемой.

person ashastral    schedule 22.06.2013