Nginx позволяет вам настроить аварийное переключение для ваших обратных прокси, вы можете поместить один экземпляр gunicorn в качестве основного, и пока эта версия работает, он никогда не будет смотреть на аварийное переключение.
Если вы настраиваете свой сайт так, чтобы ваша новая версия находилась в экземпляре отработки отказа, вам просто нужно написать свой потрясающий файл, чтобы обновить экземпляр сбоя новой версией сайта, а затем, когда все будет готово, отключить основной экземпляр. Nginx без проблем переключится на второй экземпляр, и вы получите новую версию без простоев.
Затем вы можете обновить основную версию, а затем снова включить ее, и ваша основная версия теперь доступна. На этом этапе вы можете оставить экземпляр аварийного переключения на всякий случай или отключить его.
Некоторые вещи, которые нужно учитывать. Вы должны быть осторожны с базами данных, если вы используете sqllite, убедитесь, что оба экземпляра gunicorn могут получить доступ к файлу sqllite.
Если у вас обычная база данных, это не проблема, вам просто нужно убедиться, что вы применили все миграции базы данных, которые необходимы новой версии, прежде чем переключиться на нее.
Если они являются обратно совместимыми изменениями, то это не имеет большого значения. Если они не имеют обратной совместимости, будьте осторожны, вы можете сломать старую версию сайта, прежде чем переключиться на новую версию.
Чтобы упростить задачу, я бы запустил версии в разных виртуальных средах.
Если вы используете supervisord для управления gunicorn, то вы можете использовать команды supervisorctl для перезагрузки / перезапуска любого экземпляра, который вы хотите развернуть, не затрагивая другой.
Надеюсь, это поможет
Вот пример конфигурации и nginx (не полный файл конфигурации, удалены неважные части)
Предполагается, что основной экземпляр gunicorn работает на порту 9005, а другой - на порту 9006
upstream service-backend {
server localhost:9005; # primary
server localhost:9006 backup; # only used when primary is down
}
server {
listen 80;
root /opt/htdocs;
server_name localhost;
access_log /var/logs/nginx/access.log;
error_log /var/logs/nginx/error.log;
location / {
proxy_pass http://service-backend;
}
}