Как развернуть flask приложение на сервере
В этой статье мы развернем приложение Flask на виртуальном частном сервере (VPS) с помощью программного обеспечения Apache Webserver и mod_wsgi WSGI.
В этой статье мы развернем приложение Flask на виртуальном частном сервере (VPS) с помощью программного обеспечения Apache Webserver и mod_wsgi WSGI.
Что такое VPS?
Различные компании, такие как Google, Amazon, предоставляют услуги облачных серверов (GCP, AWS и т. Д.). В рамках этой услуги вы можете предоставить в аренду различные серверы, расположенные в разных частях мира. Они взимают с вас плату в зависимости от различных стандартов, таких как используемые часы, загрузка процессора и т. Д.
Использование облачного сервера дает вам несколько преимуществ, таких как:
- Серверы, работающие 24 часа – С облачными серверами ваше приложение, развернутое на них, будет работать 24 часа. В случае локального хоста(вашего ноутбука) вам нужно поддерживать его в рабочем состоянии в течение 24 часов, что непрактично.
- Масштабируемость – В случае, если ваше хранилище заполнено, вы можете быстро масштабировать свои сервисы(хранилище, оперативную память и т. Д.) В облаке.
- Более безопасный – Поскольку все оборудование присутствует в облачном центре, оно более безопасно.
- Доступность – Вы можете получить доступ к облачному серверу с любого ноутбука или компьютера.
В этом уроке мы будем использовать веб – сервисы AWS- Amazon для развертывания. Вы можете обратиться к любому из поставщиков VPS.
Программное обеспечение, необходимое для запуска приложения в Интернете
Теперь приложение Flask, развернутое на VPS, должно выполнить следующие действия:
Для выполнения всех этих задач нам требуется различное следующее программное обеспечение:
Сервер приложений WSGI обеспечивает интерфейс шлюза между программным обеспечением Apache и приложением Flask. WSGI предназначен для фреймворков, написанных на python (Django/Flask)
Основное использование WSGI заключается в преобразовании запросов в формат , читаемый на python, и отправке их в код приложения (написанный на Flask-python) , который затем выполняет необходимые функции и возвращает веб-страницу ответа.
Таким образом, WSGI работает как шлюз между Apache и приложением Flask.
Давайте рассмотрим их по отдельности
Что такое программное обеспечение веб-сервера?
Основная роль программного обеспечения веб-сервера заключается в размещении веб-сайтов в Интернете. Он действует как посредник между сервером и клиентскими машинами .
Эти программные приложения обрабатывают запросы клиентов, а затем возвращают физические файлы(шаблоны/данные), присутствующие на сервере, и отображают их клиентам.
Примерами программного обеспечения веб-сервера являются Apache, NGINX и т. Д.
В этой статье мы будем использовать хороший старый Apache сервер, на котором размещается почти 47% веб-приложений в Интернете
Что такое сервер приложений mod_wsgi WSGI?
Он действует как интерфейс между программным обеспечением Apache и нашим приложением Flask, расположенным на облачном сервере.
Развертывание проекта Flask на VPS
Первым шагом является выбор сервера у поставщика VPS. Любые компании, предоставляющие VPS, будут иметь несколько серверов, работающих на разных операционных системах, как показано на рисунке
После выбора необходимого вам нужно будет выполнить несколько шагов для настройки и запуска сервера.
После настройки сервера вы получите IP адрес или Общедоступный DNS сервера, который позже потребуется для подключения к облачному серверу.
1. Подключение к Облачному серверу с локального компьютера
Мы используем команду ssh для подключения к серверу. Чтобы подключиться к облачному серверу с нашего локального компьютера, выполните следующие команды:
В оболочке просто запустите код:
Для Windows мы используем программное обеспечение под названием PuTTY , которое вы можете скачать непосредственно из Интернета. После загрузки введите cloud_IP и нажмите открыть .
Мой cloud_IP/Public DNS , который я буду использовать для доступа к своему серверу,:
Для AWS нам также необходимо использовать дополнительный закрытый ключ безопасности. Следовательно, в зависимости от поставщика VPS вам также может потребоваться добавить ключ security_key
Как только это будет сделано, вы войдете в ОС облачного сервера.
2. Установка необходимых пакетов
Как только сервер будет подключен, он будет похож на новый компьютер ubuntu. Сначала нам нужно установить в него все важные пакеты.
Поэтому выполните следующие команды:
Всегда обновляйте систему после запуска сервера.
Установка apache2 и mod_wsgi на сервере
Теперь давайте сначала установим Apache2 и пакеты mod_wsgi в системе
Чтобы проверить, работает Apache2 или нет, перейдите на общедоступный DNS/IP-адрес вашего облачного сервера. Вы увидите страницу Apache по умолчанию.
Теперь установите python3 и трубу в систему с помощью:
Установка колбы и ее расширений
Теперь установите Flask Framework и все другие необходимые Расширения Flask , такие как Flask_SQLAlchemy , Flask_login, | Flask_wtf, и т. Д
Просто установите все расширения колбы, которые вам нужны для вашего проекта колбы.
3. Перенос проекта Flask с локальной машины на облачный сервер
Вы можете создать новый каталог и закодировать в нем все приложение Flask, используя текстовый редактор nano .
Лучший вариант-закодировать проект на локальном компьютере, а затем перенести папку flask_project на облачный сервер.
Для передачи файла мы используем код
В AWS нам также необходимо вставить ключ безопасности. Если у вашего провайдера VPS нет ключа security_key, затем удалите key_path из команды
Свяжите Каталог проекта приложения Flask flask_project , присутствующий в домашнем каталоге, с конфигурациями Apache (присутствующими в каталоге /var/www/html ). Мы делаем это с помощью кода:
4. Кодирование приложения колбы
Внутри папки Flask_project у вас должны быть все файлы Flask – app.py , models.py , Шаблоны и т.д.
Давайте закодируем простое приложение Flask, поэтому в каталоге flask_project создайте файл app.py
После этого нам теперь нужно создать файл WSGI . Для этого создайте файл .wsgi с тем же именем, что и основной файл приложения Flask. В моем случае это app.wsgi
используя nano app.wsgi , добавьте код:
Отлично!! Теперь нам нужно включить mod_wsgi для взаимодействия Apache с приложением Flask.
Для этого перейдите в /etc/apache2/сайты с поддержкой/ :
Откройте файл conf 000-default.conf с помощью текстового редактора nano и ниже DocumentRoot/var/www/html строка, добавьте код:
Запуск приложения Flask
Вот и все теперь перезагрузите сервер apache:
И зайдите в общедоступный DNS, сайт будет запущен и запущен !!
Аналогично другому URL-адресу
Вывод
Ваше приложение Flask запущено и работает на облачном сервере. Попробуйте запустить свое собственное приложение Flask на облачном сервере и сообщите нам, что вы думаете. Увидимся в следующий раз, ребята 🙂
Эта статья для тех, кто хочет запустить сайт или API на Flask на своём сервере и сделать его доступным из интернета. Если Вы просто делаете заглушку для теста, или локальный веб сайт эти шаги, возможно, избыточны.
Введение
Первый деплой проекта на реальном сервере это всегда вызов.
Может появиться огромное количество трудностей, о которых обучающийся программированию даже не догадывался.
Часто нужно навыки очень далёкие от того чему можно было научиться на уроках по синтаксису языка или какому-то фреймворку.
Нужно запастить терпением и быть готовым много читать, искать, спрашивать и проверять.
Мы будем запускать проект в следующем окружении:
Подготовка
Про установку и настройку Debian Linux читайте в статье Самоучитель Debian
Про установку Nginx в Debian и Ubuntu читайте статьи Nginx на Debian и Nginx на Ubuntu
Залогинимся на сервере и выполним
sudo apt update
Проверим установлен ли pip3 командой
Если получили что-то вроде
pip 18.1 from /usr/lib/python3/dist-packages/pip (python 3.7)
Тот Pip уже установлен, если нет - нужно выполнить
sudo apt install python3-pip
Подробности про pip можете прочитать здесь
Установка пакетов
Скопируем папку с нашим проектом на сервер, перейдём в директорию, в которой лежит файл requirements.txt и выполним
pip3 install -r requirements.txt
Если Вы получили предупреждение
Как это сделать можете прочитать в статье Linux PATH
Gunicorn
После успешной установки pip3 и пакетов-зависимостей нужно установить Gunicorn.
Есть и другие средства деплоить Flask, Вы можете изучить их здесь
sudo apt install gunicorn3
gunicorn можно установить через pip особенно полезным будет вариант устанвоки gunicorn в виртуальном окружении.
В этом примере для простоты работы установка была сделана через apt
Допустим главный файл вашего приложения называется aredel_com.py и вы находитесь с ним в одной директории.
Команда для запуска приложения
Как Вы могли заметить Gunicorn слушает на порту 8000.
Мы прячем Gunicorn за Nginx, так как у Nginx много возможностей по работе с нагрузкой и безопастностью, которых нет у Gunicorn.
Выключим Gunicorn нажав CTRL + C и запустим его как демон
gunicorn3 -D aredel_com:app
В командной строке ничего не должно появиться, в отличие от обычного запуска.
Чтобы убедиться в том, что gunicorn3 работает выполните
ps -A | grep gunicorn
10704 ? 00:00:00 gunicorn3 10707 ? 00:00:00 gunicorn3
Чтобы проверить работает ли Nginx можно зайти на сервер с помощью браузера.
IP моего сервера 192.0.2.131
Про то как настраивать подключения по сети в Linux читайте статьи Debian Network и Ubuntu Network
Доступные сайты Nginx хранит в /etc/nginx/sites-available/
cd /etc/nginx/sites-available/
ls
drwxr-xr-x 2 root root 4096 syys 17 16:38 . drwxr-xr-x 8 root root 4096 syys 17 16:38 .. -rw-r--r-- 1 root root 2416 maalis 26 2020 default
Дефолтный сайт, который вы можете увидеть введя в адресную строку браузера IP вашего сервера (у меня 192.0.2.131) выглядит примерно так:
Дефолтный сайт нам не нужен, поэтому можно его просто удалить
sudo rm default
Настройка Nginx
Копируем кофигурацию для nginx. Советую делать это не отсюда а с сайта gunicorn
sudo vi default
И вставляем настройки.
Если у Вас сложности с использованием vi прочитайте статью «Текстовый редактор vi»
Редактируем настройки, чтобы они больше соответствовали названию проекта
sudo service nginx restart
Более подробную информацию о настройке связки Nginx - Gunicorn Вы можете найти здесь
Про то как настроить запуск Gunicorn при перезагрузке системы читайте здесь
Итоги
Теперь если Вы зайдёте через браузер на Ваш сервер - там появится Ваше приложение.
Как это произошло: gunicorn3 запустил приложение Flask и слушал на порту 8000
Мы запустили Nginx, который слушает порт 80 и пробрасывает соединение на порт 8000 - обратите внимание на строку
Docker — это приложение с открытым исходным кодом, позволяющее администраторам создавать, развертывать и воспроизводить приложения с помощью контейнеров. Контейнеры — это пакеты, в которых содержатся все зависимости, необходимые для запуска приложения на уровне операционной системы. Это означает, что каждое приложение, развернутое с помощью Docker, имеет собственную среду, и его требования обрабатываются отдельно.
Flask — это веб-микроструктура, построенная на базе Python. Она называется микроструктурой, потому что не требует для работы специальных инструментов или плагинов. Микроструктура Flask отличается компактностью, гибкостью и высоким уровнем структурирования, за счет чего она более предпочтительна по сравнению с другими программными структурами.
Развертывание приложения Flask с помощью Docker позволит вам воспроизводить приложение на разных серверах с минимальными изменениями конфигурации.
В этом обучающем модуле вы создадите приложение Flask и выполните его развертывание с помощью Docker. Также в этом обучающем модуле мы расскажем, как обновить приложение после развертывания.
Предварительные требования
Для выполнения этого руководства вам потребуется следующее:
- Пользователь без прав root с привилегиями sudo, настроенный в соответствии с указаниями обучающего модуля «Начальная настройка сервера на базе Ubuntu 18.04».
- Один сервер Ubuntu 18.04 с установленным программным обеспечением Docker, которое настроено в соответствии с указаниями этого обучающего модуля или с помощью моментально развертываемого образа Docker от DigitalOcean.
- Веб-сервер Nginx, установленный в соответствии с указаниями по первому шагу в обучающем модуле «Установка Nginx на сервере Ubuntu 18.04».
Шаг 1 — Настройка приложения Flask
Вначале вы создадите структуру каталогов, где будет размещено ваше приложение Flask. В этом обучающем модуле мы создадим каталог TestApp в каталоге /var/www , но вы можете изменить команду и использовать любое другое название.
Перейдите в созданный каталог TestApp :
Создайте базовую структуру папок для приложения Flask:
Флаг -p означает, что команда mkdir создаст каталог и все его родительские каталоги, которых еще не существует. В данном случае команда mkdir создаст родительский каталог app в процессе создания каталогов static и templates .
В каталоге app будут находиться все файлы, связанные с приложением Flask, в том числе views и blueprints. Views — это создаваемый вами код, обеспечивающий ответы на запросы вашего приложения. Blueprints создает компоненты приложения и поддерживает стандартные шаблоны внутри приложения или для нескольких разных приложений.
В каталоге static хранятся различные ресурсы, в том числе файлы изображений, CSS и JavaScript. В каталоге templates хранятся шаблоны HTML для вашего проекта.
Теперь базовая структура папок готова, и вы можете создать все файлы, необходимые для запуска приложения Flask. Вначале создайте файл __init__.py в каталоге app . Этот файл сообщает интерпретатору Python, что каталог app является пакетом, и его следует рассматривать именно как пакет.
Запустите следующую команду для создания файла:
Пакеты в Python позволяют группировать модули в логические пространства имен или иерархии. Этот подход позволяет разбивать код на отдельные управляемые блоки, которые выполняют конкретные функции.
Затем вы добавитье в файл __init__.py код, который создаст экземпляр Flask и импортирует логику из файла views.py , которы вы создадите после сохранения этого файла. Добавьте в новый файл следующий код:
После добавления этого кода сохраните и закройте файл.
После создания файла __init__.py вы будете готовы создать файл views.py в каталоге app . В этом файле будет содержаться большая часть логики вашего приложения.
Затем добавьте код в файл views.py . Этот код будет возвращать фразу hello world! строка для пользователей, посещающих вашу веб-страницу:
Строка @app.route над функцией называется декоратором. Декораторы изменяют функцию, которая следует за ними. В данном случае декторатор указывает Flask, какой URL активирует функцию home() . Текст hello world , возвращаемый функцией home , будет отображаться пользователю в браузере.
Для создания этого файла запустите следующую команду:
Затем добавьте в файл следующее содержание для настройки сервера uWSGI:
Этот код определяет модуль, из которого будет обслуживаться приложение Flask. В данном случае это файл main.py , который здесь указывается как main . Опция callable указывает uWSGI использовать экземпляр app , экспортированный основным приложением. Параметр master позволяет вашему приложению продолжать работать, и поэтому даже при перезагрузке всего приложения время простоя будет минимальным.
Теперь создайте файл main.py , который будет главной точкой входа в приложение. Точка входа сообщает uWSGI, как следует взаимодействовать с приложением.
Далее скопируйте и вставьте в файл следующий код. Этот код импортирует экземпляр Flask под названием app из пакета приложения, созданного на предыдущих шагах.
Наконец, создайте файл requirements.txt , чтобы указать, какие зависимости диспетчер пакетов pip установит в вашу среду Docker:
Добавьте следующую строку для добавления Flask в качестве зависимости:
В нем указывается устанавливаемая версия Flask. На момент составления настоящего обучающего модуля последней версией Flask была версия 1.0.2 . Вы можете проверить обновления Flask на официальном сайте.
Сохраните и закройте файл. Вы успешно настроили свое приложение Flask и готовы к настройке Docker.
Шаг 2 — Настройка Docker
На этом шаге вы создадите два файла для развертывания Docker, Dockerfile и start.sh . Dockerfile — это текстовый документ, содержащий команды, используемые для сборки образа. Файл start.sh — это скрипт оболочки, который построит образ и создаст контейнер из файла Dockerfile .
Вначале создайте файл Dockerfile .
Далее добавьте в файл Dockerfile желаемую конфигурацию. Эти команды указывают, как будет построен образ, и какие дополнительные требования будут в него включены.
В этом примере образ Docker будет построен на основе существующего образа tiangolo/uwsgi-nginx-flask , который можно найти на ресурсе DockerHub. Этот конкретный образ Docker лучше многих других, потому что он поддерживает широкий спектр версий Python и образов ОСs.
В первых двух строках указывается родительский образ, который вы будете использовать для запуска приложений и установки процессора команд bash и текстового редактора nano . Также он устанавливает клиент git для связи со службами хостинга контроля версий, такими как GitHub, GitLab и Bitbucket. ENV STATIC_URL /static — переменная среды, используемая для конкретного образа Docker. Она определяет статичную папку, где хранятся все ресурсы, включая образы, файлы CSS и файлы JavaScript.
Последние две строки копируют в контейнер файл requirements.txt , чтобы его можно было выполнить, а затем выполняют синтаксический анализ файла requirements.txt для установки указанных зависимостей.
Сохраните и закройте файл после добавления вашей конфигурации.
Теперь вы установили файл Dockerfile и уже почти готовы написать скрипт start.sh , который построит для вас контейнер Docker. Прежде чем создавать скрипт start.sh , убедитесь, что у вас имеется открытый порт для использования в конфигурации. Чтобы проверить, свободен ли порт, запустите следующую команду:
Если вывод команды больше 1 , это означает, что порт свободен и готов к использованию. В противном случае, вам нужно будет выбрать другой порт для использования в файле конфигурации start.sh .
Когда вы найдете открытый порт для использования, создайте скрипт start.sh :
Скрипт start.sh — это скрипт оболочки, создающий образ из файла Dockerfile и создающий контейнер на основе полученного образа Docker. Добавьте свою конфигурацию в новый файл:
Первая строка называется shebang. Она указывает, что это файл bash, и что его нужно выполнять как команды. В следующей строке указывается, какое имя вы хотите присвоить образу и контейнеру, а также выполняется сохранение этого имени в переменной app . Следующая строка указывает Docker построить образ из файла Dockerfile , находящегося в текущем каталоге. В этом примере будет создан образ с именем docker.test .
Последние три строки создают новый контейнер с именем docker.test с открытым портом 56733 . Наконец, текущий каталог связывается с каталогом /var/www directory в контейнере.
Флаг -d используется для запуска контейнера в режиме демона или в качестве фонового процесса. Флаг -p используется для привязки порта на сервере к конкретному порту контейнера Docker. В данном случае вы привязываете порт 56733 к порту 80 контейнера Docker. Флаг -v указывает, какой том Docker следует монтировать на контейнер. В данном случае вы монтируете весь каталог проекта в папку /var/www в контейнере Docker.
Запустите скрипт start.sh для создания образа Docker и построения контейнера на основе этого образа:
После завершения выполнения скрипта используйте следующую команду для вывода списка всех запущенных контейнеров:
В результате будет выведен список контейнеров:
На этом шаге вы успешно развернули свое приложение Flask в контейнере Docker. Теперь вы используете шаблоны, чтобы показать пользователям контент.
Шаг 3 — Работа с файлами шаблонов
Шаблоны — это файлы, показывающие статичный и динамический контент пользователям вашего приложения. На этом шаге вы создадите шаблон HTML для создания главной страницы приложения.
Вначале создайте файл home.html в каталоге app/templates :
Добавьте код для вашего шаблона. Этот код создаст страницу HTML5, содержащую заголовок и текст.
После добавления шаблона сохраните и закройте файл.
Теперь измените файл app/views.py , чтобы обслуживать созданный файл:
Вначале добавьте в начале файла следующую строку для импорта метода render_template из Flask. Этот метод проводит синтаксический анализ файла HTML для рендеринга веб-страницы для пользователя.
В конце файла вы добавите новый маршрут для рендеринга файла шаблона. Данный код указывает, что пользователям выводится содержимое файла home.html всегда, когда они посещают маршрут /template в вашем приложении.
Обновленный файл app/views.py будет выглядеть примерно следующим образом:
Сохраните и закройте файл после завершения.
Чтобы эти изменения вступили в силу, вам нужно будет остановить и перезапустить контейнеры Docker. Запустите следующую команду для повторного построения контейнера:
Вы создали файл шаблона Docker, который будет выводиться посетителям вашего приложения. На следующем шаге вы увидите. как вносимые вами в приложение изменения могут вступить в силу без необходимости перезапуска контейнера Docker.
Шаг 4 — Обновление приложения
Иногда в приложение бывает нужно внести изменения. Это может быть установка новых требований, обновление контейнера Docker или внесение изменений в код HTML и логику. В этом разделе вы настроите команду touch-reload для внесения этих зменений без перезапуска контейнера Docker.
Функция автоматической перезагрузки Python отслеживает изменения во всей файловой системе и обновляет приложение при обнаружении изменений. Автоматическая перезагрузка не рекомендуется в производственной среди, поскольку она может очень быстро увеличить нагрузку на ресурсы системы. На этом шаге вы используете команду touch-reload для отслеживания изменений определенного файла и перезагрузке контейнера в случае обновления или замены файла.
Для реализации этой функции откройте файл uwsgi.ini :
Добавьте в конец файла выделенную строку:
Эта строка указывает файл, изменение которого запускает перезагрузку приложения. После внесения изменений сохраните и закройте файл.
Чтобы продемонстрировать это, внесите в ваше приложение небольшое изменение. Для начала откройте файл app/views.py :
Замените строку, возвращаемую функцией home :
Сохраните и закройте файл после внесения изменения.
Еще раз перезагрузите главную страницу приложения в браузере. Вы увидите, что в приложение включены изменения:
На этом шаге вы выберете условие команды touch-reload , с которым приложение будет обновляться после внесения изменений.
Заключение
В этом обучающем модуле вы создали и развернули приложение Flask в контейнере Docker. Также вы настроили команду touch-reload для обновления приложения без необходимости перезапуска контейнера.
Новое приложение в Docker можно будет легко масштабировать. Чтобы узнать больше об использовании Docker, ознакомьтесь с официальной документацией.
Существуют готовые Python хостинги, такие как Heroku и PythonAnywhere, которые позволяют запустить Python код за считанные минуты, но это не наша цель сегодня.
В мире Python существует довольно много различных супервизоров, предназначенных для запуска веб-приложений Python: uWSGI, gunicorn, gevent, twisted web и т.д. Они выступают подсредником между веб сервером Apache или nginx и обработчиком Python, которые проксируют запросы на супервизор. Однако, пожалуй, наиболее производительным и гибким супервизором является uWSGI. Опять же, для небольших проектов я рекомендую gunicorn, который проще в настройке. Хотя есть масса примеров успешного использования gunicorn в высоконагруженных проектах.
Таким образом в данной статье мы будем использовать связку CentOS + Python + gunicorn + Flask.
План развертывания Flask приложения на VPS сервере
В этой статье мы считаем, что nginx уже развернут и работает. Итак, вот типичные шаги, которые нужно сделать на любом хостинге вне зависимости от операционной системы и версии:
- Установка python 3 и pip 3 на ОС
- Развертывание виртуальной среды virtualenv
- Установка Python, Flask и gunicron и обновление pip в virtualenv
- Копируем проект Python с локальной машины на хостинг в папку виртуального проекта
- Разрешаем порт 5000 в файрволе наружу
- Запускаем python с Flask проектом и проверяем его доступность на 5000 порту
- Создаем точку входа WSGI
- Запускаем gunicorn на 5000 порту и проверяем доступность приложения через супервизор
- Деактивируем виртуальную среду
- Создаем системный сервис для gunicorn с автозапуском и стартуем его
- Настраиваем nginx для проксирования запросов в gunicorn
- Перезапускаем nginx
Развертывание Flask по шагам
Шаг 1. Установка python 3 и pip 3 на ОС
В CentOS 7 по умолчанию установлен Python 2.7.5 (можно проверить командой python -V). Нам необходимо установить 3 версию совместно со 2й. Вы можете заменить стандартную версию, изменив символьную ссылку python с /usr/bin/python2 на /usr/bin/python36. Но если кому-то нужна будет старая версия, начнутся проблемы. Например, перестанет работать yum :) Поэтому я рекомендую системный python не трогать.
yum install -y python36 python3 -V yum install -y python3-pip yum install -y python3-devel
Возможно, вам дополнительно потребуются пакеты python3-dev, build-essential, libssl-dev, libffi-dev, python3-setuptools. Их установка на ваше усмотрение.
Шаг 2. Настройка виртуальной среды
Установим пакет virtualenv:
yum install -y python36-virtualenv
Создадим и перейдем в папку, где хотим создать наш проект. Укажите такое название папки, которое у вас используется в самом проекте в PyCharm. У меня это не корневая папка корневой директории аккаунта (так сложнее, но необходимо, когда у вас несколько сайтов на одной аккаунте).
Создаем тестовый проект в виртуальной среде:
python3 -m venv testprj
Локальные копии Python и pip будут установлены в каталог testprj в каталоге вашего проекта.
Прежде чем устанавливать приложения в виртуальной среде, ее нужно активировать. Для этого нужно ввести следующую команду:
Командная строка изменится, показывая, что теперь вы работаете в виртуальной среде. Она будет выглядеть примерно так: (testprj) user@host:
Шаг 3. Установка пакетов в виртуальной среде
Находясь в виртуальной среде, вы можете установить Flask и Gunicorn и начать работу над созданием вашего приложения.
Вначале мы установим wheel с локальным экземпляром pip , чтобы убедиться, что наши пакеты будут устанавливаться даже при отсутствии архивов wheel, апгрейдим pip и устанавливаем Flask и gunicorn:
pip install wheel pip install --upgrade pip pip install gunicorn flask flask-sqlalchemy
Шаги 4-6. Заливаем и тестируем приложение в виртуальной среде
Копируем по SFTP/FTP файлы в папку вашей виртуальной среды, в моем случае это /home/ipnets/public_html/py/testsite/ вместе с папками static и templates, которые обязательны для Flask проекта.
Проверяем запуск приложения и открываем его через браузер. Мы помним, что Flask по умолчанию слушает на 5000 порту. Для того, чтобы открыть сайт из интернета на этом порту, необходимо разрешить это порт в файрволе. В iptables это делается так:
iptables -A INPUT -p tcp -m tcp --sport 5000 -j ACCEPT iptables -A OUTPUT -p tcp -m tcp --dport 5000 -j ACCEPT
Приложение у меня вызывается файлом app.py:
После запуска вы должны увидеть следующее:
* Serving Flask app "app" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on (Press CTRL+C to quit)
Шаг 7. Создание точки входа WSGI
Теперь в виртуальной среде создадим файл, который будет служить точкой входа в наше приложение. Он будет лежать там же, где и приложение. Это покажет серверу Gunicorn, как взаимодействовать с приложением.
Мы назовем этот файл wsgi.py :
Нужно убедиться, что Gunicorn может правильно обслуживать приложение. Для этого нужно просто передать имя нашей точки входа. Оно составляется из имени файла модуля (без расширения .py ) и имени вызываемого элемента приложения. В нашем случае это wsgi:app .
Также мы укажем интерфейс и порт 5000 для привязки, чтобы приложение запускалось через общедоступный интерфейс. Во время тестирования я обнаружил, что если мы делаем более одного обращения к Gunicorn, то он зависает и выдает 502 ошибку Gateway Timeout. Для решения этой проблемы я просто добавил воркеров, иначе gunicorn уходит в бесконечный цикл.
gunicorn --bind 0.0.0.0:5000 wsgi:app --workers=3
Опять же, если приложение открывается через браузер на 5000 порту, то все хорошо. Можно закрыть gunicorn, нажав CTRL+C в окне терминала и деактивировать среду:
Теперь любые команды Python снова будут использовать системную среду Python.
Шаг 10. Создаем системный сервис для gunicorn
Мы создадим файл служб systemd. Создание файла элементов systemd позволит системе инициализации Ubuntu автоматически запускать Gunicorn и обслуживать приложение Flask при загрузке сервера.
Для начала создаем файл с расширением .service в каталоге /etc/systemd/system :
Содержимое файла будет следующим:
[Unit] Description=Gunicorn instance to serve testrj After=network.target [Service] User=ipnets Group=nginx WorkingDirectory=/home/ipnets/public_html/py/testsite Environment="PATH=/home/ipnets/public_html/py/testsite/testprj/bin" ExecStart=/home/ipnets/public_html/py/testsite/testprj/bin/gunicorn --workers 3 --bind 127.0.0.1:5000 wsgi:app [Install] WantedBy=multi-user.target
Мы начнем с раздела [Unit] этого файла, где указываются метаданные и зависимости. Здесь мы разместим описание службы и предпишем системе инициализации запускать ее только после достижения сетевой цели.
В разделе [Service] указывается пользователь и группа, от имени которых мы хотим запустить данный процесс. Сделаем владельцем процесса учетную запись обычного пользователя, поскольку этот пользователь является владельцем всех соответствующих файлов. Также назначим владельцем группу nginx , чтобы упростить коммуникацию Nginx с процессом Gunicorn (в некоторых конфигурациях это будет группа www-data или nobody ).
Теперь укажем рабочий каталог приложения и зададим переменную среды PATH , чтобы система инициализации знала, что исполняемые файлы этого процесса находятся в нашей виртуальной среде. Systemd требует, чтобы мы указывали полный путь исполняемого файла Gunicorn, установленного в нашей виртуальной среде. Также укажем команду для запуска службы gunicorn. Эта команда будет выполнять следующее:
Когда Gunicorn запускается, он создает TCP сокет или Unix сокет файл и использует его, чтобы слушать запросы от nginx. Соответственно, существует два способа биндинга (привязки) gunicorn к nginx: через TCP порт или через sock файл. Стандартным по умолчанию (и менее ресурсоемким) является способ через sock файл, однако с ним бывают проблемы. В частности, nginx не всегда может прочитать этот файл. В таком случае вы получите ошибку 502.
В частности, у меня были проблемы с unix сокет файлом, менно из-за этого я выбрал способ с TCP сокетами выше. Однако. если вы хотите использовать чаще рекомендуемый способ с Unix сокетами, то вам надо будет изменить строку запуска gunicorn на следующую:
ExecStart=/home/ipnets/public_html/py/testsite/testprj/bin/gunicorn --workers 3 --bind unix:testprj.sock -m 007 wsgi:app
В ней происходит создание и привязвка к файлу сокетов Unix testprj .sock в каталоге нашего проекта. Мы зададим значение umask 007 , чтобы при создании файла сокета предоставлялся доступ для владельца и для группы, а любой другой доступ ограничивался.
Проверить, под каким пользователем запущен nginx можно в файле конфигурации: /etc/nginx/nginx.conf
Наконец, добавим раздел [Install] . Это покажет systemd, куда привязывать эту службу, если мы активируем ее запуск при загрузке. Нам нужно, чтобы эта служба запускалась во время работы обычной многопользовательской системы.
Теперь мы запустим созданную службу Gunicorn, и активируем ее запуск при загрузке системы:
systemctl start gunicorn systemctl enable gunicorn systemctl status gunicorn
Если служба не может запуститься, то скорее всего ей не хватает прав на создание sock файла или порт биндинга занят.
Шаг 12. Настраиваем nginx для проксирования запросов в gunicorn
Сервер приложений Gunicorn должен быть запущен и ожидать запросы файла сокета в каталоге проекта или на порту TCP сокета. Теперь мы настроим Nginx для передачи веб-запросов на этот сокет. Для этого мы сделаем небольшие добавления в его файл конфигурации.
В зависимости от вашей конфигурации nginx, файлы виртуальных хостов будут лежать по разному пути. Это может быть или /etc/nginx/sites-available/ или, как в моем случае (я использую связку nginx+apache), в /etc/nginx/conf.d/vhosts/ . Для каждого сайта, хоста, поддомена в моем случае я использую отдельный conf файл, который подтягивается через агрегирующий файл /etc/nginx/conf.d/vhosts.conf .
В частности, для данного проекта я создал отдельный поддомен и отдельный conf файл с таким содержимым:
/\.bzr/ disable_symlinks if_not_owner from=/home/ipnets/public_html/py; >
В данном файле вам надо заменить IP в строке listen на ваш публичный, server_name на ваш домен и отредактировать строку proxy_pass. Она должна полностью соответствовать тому, что вы указали в биндинге gunicorn.
Если вы использовали Unix сокет, то ваша строка будет выглядеть так:
Если вы используете sock файл, то пользователя, которым им владеет, нужно добавить в группу, под которой запущен nginx:
usermod -a -G ipnets nginx
Проверим конфигурацию nginx на ошибки:
Если все хорошо, то перезапускаем nginx и проверяем, что сайт открывается по адресу поддомена или домена.
systemctl restart nginx
Читайте также: