Запуск Flask приложения на Linux сервере

Содержание
Для кого написана эта статья
Введение
Подготовка
Pip
Установка пакетов
Gunicorn
Настройка Nginx
Итоги
Другие статьи о Flask

Для кого написана эта статья

Эта статья для тех, кто хочет запустить сайт или API на Flask на своём сервере и сделать его доступным из интернета. Если Вы просто делаете заглушку для теста, или локальный веб сайт эти шаги, возможно, избыточны.

Похожие статьи:

Введение

Первый деплой проекта на реальном сервере это всегда вызов.

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

Часто нужно навыки очень далёкие от того чему можно было научиться на уроках по синтаксису языка или какому-то фреймворку.

Нужно запастить терпением и быть готовым много читать, искать, спрашивать и проверять.

Мы будем запускать проект в следующем окружении:

Debian

Nginx

Gunicorn

Подготовка

Про установку и настройку Debian Linux читайте в статье Самоучитель Debian

Про установку Nginx в Debian и Ubuntu читайте статьи Nginx на Debian и Nginx на Ubuntu

Залогинимся на сервере и выполним

sudo apt update

Pip

Проверим установлен ли pip3 командой

pip3 --version

Если получили что-то вроде

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

Если Вы получили предупреждение

The script flask is installed in '/home/andrei/.local/bin' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.

Значит нужно добавить '/home/andrei/.local/bin' в PATH

Как это сделать можете прочитать в статье Linux PATH

Gunicorn

После успешной установки pip3 и пакетов-зависимостей нужно установить Gunicorn.

Есть и другие средства деплоить Flask, Вы можете изучить их здесь

sudo apt install gunicorn3

gunicorn можно установить через pip особенно полезным будет вариант установки gunicorn в виртуальном окружении.

В этом примере для простоты работы установка была сделана через apt

Допустим главный файл вашего приложения называется aredel_com.py и вы находитесь с ним в одной директории.

Команда для запуска приложения

gunicorn3 aredel_com:app

[2020-06-19 12:49:13 +0300] [10692] [INFO] Starting gunicorn 19.9.0 [2020-06-19 12:49:13 +0300] [10692] [INFO] Listening at: http://127.0.0.1:8000 (10692) [2020-06-19 12:49:13 +0300] [10692] [INFO] Using worker: sync [2020-06-19 12:49:13 +0300] [10695] [INFO] Booting worker with pid: 10695

Как Вы могли заметить Gunicorn слушает на порту 8000.

HTTP запросу нужно слушать на порту 80, но этим будет заниматься Nginx и потом перенаправлять на 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) выглядит примерно так:

Nginx default www.andreyolegovich.ru
Nginx default

Дефолтный сайт нам не нужен, поэтому можно его просто удалить

sudo rm default

Настройка Nginx

Чтобы запустить свой сайт на Nginx будем следовать инструкции с gunicorn.org

Копируем кофигурацию для nginx. Советую делать это не отсюда а с сайта gunicorn

server { listen 80; server_name example.org; access_log /var/log/nginx/example.log; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

Выполняем

sudo vi default

И вставляем настройки.

Если у Вас сложности с использованием vi прочитайте статью «Текстовый редактор vi»

Редактируем настройки, чтобы они больше соответствовали названию проекта

server { listen 80; server_name aredel.com; access_log /var/log/nginx/aredel_com.log; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

Перезапустим nginx

sudo service nginx restart

Более подробную информацию о настройке связки Nginx - Gunicorn Вы можете найти здесь

Про то как настроить запуск Gunicorn при перезагрузке системы читайте здесь

Итоги

Теперь если Вы зайдёте через браузер на Ваш сервер - там появится Ваше приложение.

Как это произошло: gunicorn3 запустил приложение Flask и слушал на порту 8000

Мы запустили Nginx, который слушает порт 80 и пробрасывает соединение на порт 8000 - обратите внимание на строку

proxy_pass http://127.0.0.1:8000;

Похожие статьи
Flask
Основы
Python
Запуск Flask на хостинге
Запуск Flask на Linux сервере
Flask в Docker
Первый проект на Flask
Шаблоны Jinja
Web Forms
Blueprint - Чертежи Flask
Как разбить приложение Flask на части
Flask FAQ
Ошибки
Декораторы в Python
HTML
CSS