Запуск 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) выглядит примерно так:
Дефолтный сайт нам не нужен, поэтому можно его просто удалить
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;