Простое развертывание Django на одном сервере - PullRequest
5 голосов
/ 21 июня 2011

У меня есть новый веб-сайт, построенный на Django и Python 2.6, который я развернул в облаке (совместное модное слово И экземпляр Amazon micro EC2 бесплатный!).
Вот мои подробные заметки: https://docs.google.com/document/d/1qcZ_SqxNcFlGKNyp-CXqcFxXXsKs26Avv3mytXGCedA/edit?hl=en_US

Поскольку это новый сайт (и я хочу играть с новейшими и лучшими), я использовал Nginx и Gunicorn поверх Supervisor.
Все программное обеспечение установлено из транка с использованием YUM / easy_install.
Моя база данных Sqlite (на данный момент - не уверен, куда идти дальше, но это не вопрос). Также в списке задач: virtualenv + pip.
Пока все хорошо.
Мой код в SVN. Я написал простой файл для развертывания - проверяет последний код и перезапускает Gunicorn через Supervisor. Я подключил свое DNS-имя к Эластичному IP.
Работает.

У меня вопрос, как мне обновить сайт без перерыва в обслуживании? Пользователи сайта получают 404 с / 500 с, когда я запускаю свой маленький скрипт обновления.

Есть ли способ сделать это без добавления другого сервера (цена является ключевой)?

Мне бы хотелось иметь систему подготовки (на другом порту?) И плавное переключение между подготовкой и производством. На этом же (бесплатном) сервере. Via Fabric.
Как я могу это сделать? Это тот же Nginx, на котором работают оба сайта? Могу ли я обновить Staging без ущерба для производства? Как будет выглядеть этот файл? Как будет выглядеть дерево каталогов?

Спасибо!

Tal.

Похожие:

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

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;
    }
}
1 голос
/ 21 июня 2011

Звучит так, как будто вам нужно выяснить, как заставить огнестрельное оружие изящно перезапустить .Кажется, что все, что вам нужно сделать, это выдать HUP для процесса gunicorn, когда нужно уведомить о перезагрузке приложения.Как описано в ссылке, gunicorn docs объясняет, как это сделать.

...