Я следую ответу Кена Кокрана на вопрос Простое развертывание 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? (Я заинтересован в нулевом времени простоя, поэтому меня привлекла модель с двумя серверами.)