Развертывание приложений Django

    Введение

    После того, как мы закончили разработку веб-приложения, оно должно быть размещено на хосте, чтобы общественность могла получить доступ к нему из любого места. Мы посмотрим, как развернуть и разместить приложение на экземпляре AWS EC2, используя Nginx в качестве веб-сервера и Gunicorn в качестве WSGI.

    AWS EC2

    Amazon Elastic Compute Cloud (Amazon EC2) - это веб-сервис, обеспечивающий масштабируемость вычислительных мощностей в облаке. Мы устанавливаем и размещаем наши веб-приложения на экземпляре EC2 после выбора AMI (OS) по нашему усмотрению. Подробнее об этом мы поговорим в следующих разделах.

    NGINX

    Nginx - это веб-сервер с открытым исходным кодом. Мы будем использовать Nginx для сервера наших веб-страниц по мере необходимости.

    GUNICORN

    Gunicorn - это серверная реализация интерфейса шлюза Web Server Gateway Interface (WSGI), который обычно используется для запуска веб-приложений Python.

    WSGI - используется для переадресации запроса с веб-сервера на Python бэкэнд.

    Мы не будем использовать сервер, который поставляется с django по умолчанию в производстве.

    Развертывание приложения

    Мы запустим EC2 экземпляр на AWS, для этого войдите в консоль aws.

    • Выберите EC2 из всех сервисов

    • Выберите запуск New instance и выберите Ubuntu из списка.

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

    • Теперь настройте группы безопасности и откройте порты 8000 и 9000, так как мы будем использовать эти порты . Просмотрите и запустите ваш экземпляр, может потребоваться некоторое время, чтобы он запустился.

    Подключение к Экземпляру

    Мы можем подключиться к экземпляру, используя опцию 'connect' в консоли (или с помощью putty или любого другого подобного инструмента ). После подключения запустите следующие команды

    sudo apt-get update

    Установите python , pip и django

    sudo apt install python
    sudo apt install python3-pip
    pip3 install django

    Теперь, когда мы установили наши зависимости, мы можем создать папку, в которую мы скопируем наше приложение django.

    cd  /home/ubuntu/  
    mkdir Project
    cd Project
    mkdir ProjectName
    cd ProjectName

    Теперь мы поместим наш код по следующему пути.
    /home/ubuntu/Project/ProjectName

    GitHub

    Убедитесь, что ваш код находится в репозитории, чтобы мы могли легко втянуть его в наш экземпляр ec2.

    • Перейдите в только что созданную папку ( /home/ubuntu/Project/ProjectName/ )

    • git clone <repository-url>

    Это клонирует репозиторий в папку, и в следующий раз мы сможем просто вытащить изменения с помощью git pull.

    Settings.py Файл.

    Мы должны внести некоторые изменения в settings.py в нашем проекте.

    • Вставьте свои секретные ключи и пароли в переменные окружения

    • Установить Debug = False

    • Добавте Ваш домейн в ALLOWED_HOSTS

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    STATIC_ROOT = os.path.join(BASE_DIR, “static”)

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

    manage.py makemigrations
    manage.py migrate
    manage.py collectstatic

    Установка Nginx

    Для установки Nginx выполните команду

     sudo apt install nginx

    Есть конфигурационный файл с именем по умолчанию в /etc/nginx/sites-enabled/, который имеет базовую настройку для NGINX, мы отредактируем этот файл.

    sudo vi default

    Файл будет выглядеть так после добавления необходимой конфигурации, а остальная часть файла останется такой же.

    мы добавим proxy_pass http://0.0.0.0:9000 и укажем путь к нашей статической папке, добавив путь внутри каталога /static/, как указано выше. Убедитесь, что вы собрали все статические файлы в общую папку, запустив команду

    manage.py collectstatic

    Теперь запустите сервер nginx

    sudo service nginx start             #to start nginx
    sudo service nginx stop              #to stop nginx
    sudo service nginx restart           #to restart nginx

    Установка Gunicorn

    pip install gunicorn

    Убедитесь, что Вы находитесь в папке проекта, например: /home/ubuntu/Project, и запустите следующую команду, чтобы запустить gunicorn

    gunicorn ProjectName.wsgi:application- -bind 0.0.0.0:9000

    Теперь, когда мы установили и настроили nginx и gunicorn, к нашему приложению можно получить доступ через DNS экземпляра ec2.

    Комментарии 5

      +5
      Опять какие-то вредные советы…
      Если у вас файлик settings.py не в .gitignore, то после изменения на сервере Debug = False, вы уже не сможете сделать git pull, как сказано у вас в статье. Поэтому, лучше выносить это все (настройки) в отдельный файл по типу .env и оттуда считывать параметры.

      gunicorn ProjectName.wsgi:application- -bind 0.0.0.0:9000
      Что даст эта команда? Она просто в текущем соединении shh запустит этот процесс, как только вы закроете консоль gunicorn упадет и толка в этом всем 0.
      Если нужно, что бы оно постоянно работало (а я так подозреваю именно это вы и хотели получить), то можно воспользоваться systemd (как самым простым вариантом) или docker (для продвинутых).

      А еще, если на сервере несколько приложений планируется хостить, то лучше что бы у проекта был свой venv. Хотя даже если не планируется, все же лучше venv делать.
        0
        то можно воспользоваться systemd (как самым простым вариантом) или docker (для продвинутых).

        Жаль, что сейчас таких "продвинутых" слишком много. Без докера уже hello word не поднять.


        то лучше что бы у проекта был свой venv.

        Да да, а самое идеальное запихнуть по venv'у в каждый hello word контейнер. Сейчас так модно.
        Самые упоротые умудряются запихнуть в контейнер pyenv и забацать там внутри еще venv. Иначе ж hello world с помощью ansible не автоматизировать.

          0
          Жаль, что сейчас таких «продвинутых» слишком много. Без докера уже hello word не поднять.

          Ну docker для hello word — это выстрел в ноги будет, особенно новичку (хотя на чем то же тренироваться нужно). Но для чего-то маленького он реально не нужен, конечно, все зависит от того, что нужно получить, иногда все же docker очень удобно (если умеешь с ним работать:) ).

          запихнуть по venv'у в каждый hello word контейнер
          запихнуть в контейнер pyenv и забацать там внутри еще venv
          Соболезную, что такое приходилось видеть :)
        +1

        Сейчас рекомендуется тянуть настройки из переменных среды.

          +1

          подборка вредных советов

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое