Jump to content
tempy

Деплой веб приложений на flask

Recommended Posts

Всем привет котейки

Все, кто когда любо юзал микрофреймворк Flask для Python'a видел этот текст.

2147096614_Screenshot(110).png.1ea444e85b9dc373737435dd6b14dd57.png

Это автоматическое сообщение, которое предупреждает нас о том, чтобы мы не запускали веб приложение на продакшене просто из сырого файла. Такой веб-сервер будет обладать низкой производительностью, риском упасть и тд...

 

Что же делать?

Использовать высокопроизводительные веб-серверы. Мы сегодня будем юзать всем известный nginx, который обладает высокой производительностью и стабильностью, а так же gunicorn, автономный вебсервер для Python'a, служащий заменой для таких решений как: Paster/Pyramid, web2py и тд... (Возможно вас флешбекнет, если вы использовали Unicorn для Ruby).

Ну что же приступим, я для примера, в качестве системы юзаю ubuntu, поэтому для вашей системы команды могут отличаться, но они легко гуглятся. И так, предоположим, что у вас уже стоит Python, Pip, Flask, в общем все что-нужно для разработки веб-приложения. Мы же поставим только недостающие компоненты.

 

sudo apt-get update
sudo apt-get install nginx supervisor
sudo pip install gunicorn

 

Ах да, мы также будем использовать supervisor для автоматизации запуска, перезагрузки, а также как защиту от неожиданного падения сервера.
Для начала, добавим конфигурацию nginx для нашего веб-приложения.

sudo rm /etc/nginx/sites-enabled/default
sudo mkdir /etc/nginx/sites-enabled/flaskApp
sudo nano /etc/nginx/sites-enabled/flaskApp/flaskApp.conf

 

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

server {
	listen 80;
	server_name <ip_adress>;
    
    location /static {
    	alias /path/to/your/flaskApp/static;
    }
      
    location / {
    	proxy_pass http://localhost:8000;
        include /etc/nginx/proxy_params;
        proxy_redirect off;
    }
}

А теперь попытаемся понять, что тут написано. Мы создаем сервер, который будет слушать 80 порт (или какой вам надо). Мы добавляем нашу директорию со static файлами, ведь именно nginx будет их хэндлить. Далее указываем, грубо говоря, что будет происходить, когда пользователь обратиться в корневой каталог нашего веб-приложения. А произойдет редирект на 8000 порт, где по стандарту работает gunicorn, он в свою очередь будет хандлить весь python код.

Уже сейчас если вы перезагрузите nginx

sudo systemctl restart nginx

И попробуете обратиться к одному из своих static файлов, например:
http://<my_ip_adress>/static/css/style.css
То если все правильно сработало, вы увидите ваш прекрасный и так любимый css. Но при обращении в корневой каталог, вы веротянее всего получите ошибку 502 Bad Gateway, все правильно, ведь мы еще не запустили наш gunicorn на 8000 порту. Давайте займемся этим.
 

sudo gunicorn -w 3 app:app

А теперь разберемся, что тут что.
Флаг -w указывает количество worker'ов или процессов, сколько их надо, можно примерно посчитать по формуле (кол-во ядер процессора * 2) + 1, у меня все предположительно работает на базовом vds с одним ядром, поэтому я пишу 3. Далее указываем через двоеточие запускаемый файл и само веб-приложение в нем, то-есть:

run.py  >   app = Flask(__name__)
Тогда напишем run:app.

При запуске данной команды мы получим output, показывающий, что gunicorn и все его три процесса запустились. Перейдем в корневой каталог нашего приложения и о чудо! Все заработало!

Для финала, осталось лишь атоматизировать этот процесс, придется опять написать конфигурационный файл.
 

sudo nano /etc/supervisor/conf.d/flaskApp.conf

А внутрь впишем

[program:flaskApp]

directory=/path/to/your/flaskApp
command=gunicorn -w 3 app:app
user=username
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
stderr_logfile=/var/log/flaskApp/flaskApp.err.log
stdout_logfile=/var/log/flaskApp/flaskApp.out.log

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

Сохраняем и перезагружаем supervisor:

sudo systemctl restart supervisor

 

После чего все должно заработать, если нет, то проверьте статус nginx'a и supervisor'a:

sudo systemctl status nginx
sudo systemctl status supervisor

Если все в порядке, проверьте свой firewall. Возможно там закрыты необходимые порты.
 

Очень надеюсь, что здесь вы увидели хоть что-то полезное.
Всем доброй ночи, котятки!
           (っ◔◡◔)っ ❤          

  • Like 3

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...