Развертывание приложения Flask с помощью Gunicorn и Nginx на Ubuntu

Развертывание приложения Flask — это важный шаг в обеспечении доступности вашего веб-приложения для всего мира. Хотя Flask поставляется со встроенным сервером разработки, он не подходит для производства. Для надежной, масштабируемой и готовой к производству установки вам понадобится сочетание Gunicorn, Nginx и Ubuntu. В этом руководстве вы узнаете, как развернуть приложение Flask с Gunicorn и Nginx на сервере Ubuntu.

Развертывание приложений Flask на сервере может показаться сложной задачей, если вы новичок в разработке бэкенда, но в этом подробном руководстве вы разберете каждый шаг. В конце у вас будет готовое приложение Flask на Ubuntu, обслуживаемое Gunicorn и Nginx.

Понимание стека развертывания: Flask, Gunicorn и Nginx

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

Flask: микровебфреймворк

Flask — это легкий веб-фреймворк, написанный на языке Python. Он спроектирован как простой, гибкий и легкий для начала работы, что делает его популярным выбором для создания веб-приложений. Однако встроенный сервер Flask не подходит для производственных сред, поскольку не может обрабатывать более одного запроса за раз.

Gunicorn: HTTP-сервер Python WSGI

Gunicorn (Green Unicorn) — это HTTP-сервер WSGI на языке Python, который обслуживает ваше приложение Flask. Это рабочая модель pre-fork, что означает, что он запускает несколько рабочих процессов для обработки нескольких запросов одновременно. Это делает его идеальным для обслуживания приложений Flask в производстве. Gunicorn находится между вашим приложением Flask и веб-сервером (в данном случае Nginx), выполняя тяжелую работу по управлению запросами и обслуживанию ответов.

Nginx: Веб-сервер и обратный прокси

Nginx — это высокопроизводительный веб-сервер, который также выполняет функции обратного прокси, балансировщика нагрузки и HTTP-кэша. В этой установке Nginx будет сидеть перед Gunicorn, обрабатывая клиентские соединения и статический контент, а затем перенаправляя динамические запросы в Gunicorn. Такое разделение задач помогает повысить безопасность, производительность и масштабируемость.

Настройка сервера Ubuntu

Первоначальная настройка сервера

Во-первых, вам нужен доступ к серверу Ubuntu. Это может быть физическая машина, виртуальная машина или облачный экземпляр от таких провайдеров, как AWS, DigitalOcean или Google Cloud Platform.

  1. Войдите на свой сервер:
$ ssh username@your_server_ip
  1. Обновите индекс пакетов:
$ sudo apt update
  1. Обновление установленных пакетов:
$ sudo apt upgrade

Установка необходимых пакетов

Для запуска приложения Flask вам понадобятся Python, pip и virtualenv.

  1. Установите Python и pip:
$ sudo apt install python3 python3-pip
  1. Установите virtualenv:
$ sudo pip3 install virtualenv

Подготовка приложения для Flask

Создание приложения Flask

Если у вас еще нет приложения Flask, вы можете создать простое приложение. Вот пример:

  1. Создайте каталог для вашего проекта:
$ mkdir ~/myflaskapp
$ cd ~/myflaskapp
  1. Создайте виртуальную среду:
$ virtualenv venv
  1. Активируйте виртуальную среду:
$ source venv/bin/activate
  1. Установите Flask:
$ pip install Flask
  1. Создайте простое приложение Flask:

Создайте файл с именем app.py:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
      return 'Hello, World!'
if __name__ == '__main__':
      app.run()
  1. Протестируйте свое приложение:

Запустите приложение, чтобы убедиться, что все работает:

$ python app.py

Вы должны увидеть результаты, указывающие на то, что сервер разработки Flask запущен. Посетите http://your_server_ip:5000 в вашем браузере, и вы должны увидеть «Hello, World!».

Структурирование приложения Flask

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

myflaskapp/
│
├── app/
│   ├── __init__.py
│   ├── routes.py
│   ├── models.py
│   └── templates/
│
├── venv/
├── config.py
├── requirements.txt
└── wsgi.py

Создание точки входа WSGI

Gunicorn нужна точка входа WSGI для обслуживания вашего приложения Flask. Обычно это файл с именем wsgi.py:

  1. Создать wsgi.py файл:
from app import app
if __name__ == "__main__":
      app.run()
  1. Установите дополнительные зависимости:

Если у вашего приложения есть дополнительные зависимости, перечислите их в файле requirements.txt файле и установите их:

$ pip freeze > requirements.txt
$ pip install -r requirements.txt

Развертывание Flask с помощью Gunicorn

Установка Gunicorn

Gunicorn — это пакет для Python, поэтому его можно установить с помощью pip.

  1. Установите Gunicorn:
$ pip install gunicorn

Запуск Gunicorn

Чтобы проверить, что Gunicorn может обслуживать ваше приложение, выполните следующую команду:

$ gunicorn --bind 0.0.0.0:8000 wsgi:app

Эта команда указывает Gunicorn обслуживать ваше приложение Flask, используя wsgi.py файл, привязываясь к порту 8000. Вы должны иметь доступ к своему приложению по адресу http://your_server_ip:8000.

Настройка Gunicorn для производства

Для производства обычно требуется запустить Gunicorn с несколькими рабочими процессами для одновременной обработки множества запросов.

  1. Создайте файл службы systemd для Gunicorn:

Это позволит вам управлять Gunicorn с помощью systemd, системы init, используемой в Ubuntu.

$ sudo nano /etc/systemd/system/gunicorn.service

Добавьте следующее содержание:

[Unit]
Description=Gunicorn instance to serve myflaskapp
After=network.target
[Service]
User=yourusername
Group=www-data
WorkingDirectory=/home/yourusername/myflaskapp
Environment="PATH=/home/yourusername/myflaskapp/venv/bin"
ExecStart=/home/yourusername/myflaskapp/venv/bin/gunicorn --workers 3 --bind unix:myflaskapp.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target

Заменить yourusername на ваше настоящее имя пользователя.

  1. Запустите и включите службу Gunicorn:
$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn
  1. Проверьте состояние службы Gunicorn:
$ sudo systemctl status gunicorn

Если все настроено правильно, Gunicorn должен быть запущен и обслуживать ваше приложение Flask.

Настройка Nginx

Установка Nginx

Если у вас не установлен Nginx, вы можете установить его с помощью следующей команды:

$ sudo apt install nginx

Настройка Nginx в качестве обратного прокси

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

  1. Создайте новый серверный блок:
$ sudo nano /etc/nginx/sites-available/myflaskapp

Добавьте следующее содержимое:

server {
      listen 80;
      server_name your_domain_or_IP;
      location / {
         include proxy_params;
         proxy_pass http://unix:/home/yourusername/myflaskapp/myflaskapp.sock;
      }
      location /static/ {
         alias /home/yourusername/myflaskapp/app/static/;
      }
      error_log /home/yourusername/myflaskapp/error.log;
      access_log /home/yourusername/myflaskapp/access.log;
}

Заменить yourusername на ваше настоящее имя пользователя и your_domain_or_IP с IP-адресом или доменным именем вашего сервера.

  1. Включите новый блок сервера:
$ sudo ln -s /etc/nginx/sites-available/myflaskapp /etc/nginx/sites-enabled
  1. Проверьте конфигурацию Nginx:
$ sudo nginx -t

Если проверка прошла успешно, вы должны увидеть вывод, указывающий на то, что конфигурация в порядке.

  1. Перезапустите Nginx, чтобы применить изменения:
$ sudo systemctl restart nginx

Разрешение Nginx через брандмауэр

Если вы используете UFW (Uncomplicated Firewall), вам нужно разрешить Nginx через брандмауэр.

$ sudo ufw allow 'Nginx Full'

Защита приложения с помощью SSL

Чтобы защитить приложение, можно настроить SSL с помощью Let’s Encrypt.

Установка Certbot

Certbot — это инструмент для автоматизации процесса получения и обновления SSL-сертификатов.

  1. Установите Certbot и плагин для Nginx:
$ sudo apt install certbot python3-certbot-nginx
  1. Получите SSL-сертификат:

Выполните следующую команду, заменив your_domain_or_IP на ваш домен или IP-адрес:

$ sudo certbot --nginx -d your_domain_or_IP
  1. Проверьте обновление сертификата SSL:

Certbot автоматически обновляет ваши SSL-сертификаты. Вы можете имитировать обновление, чтобы проверить, работает ли оно:

$ sudo certbot renew --dry-run

Мониторинг и ведение журналов

Журналы Gunicorn

Gunicorn будет записывать свои выходные данные в журнал systemd. Чтобы просмотреть журналы:

$ sudo journalctl -u gunicorn

Журналы Nginx

Nginx записывает запросы и ошибки в файлы журналов в /var/log/nginx/. Вы можете просмотреть их с помощью:

$ sudo tail -f /var/log/nginx/access.log
$ sudo tail -f /var/log/nginx/error.log

Устранение общих проблем

Gunicorn не запускается

  • Проверьте состояние службы Gunicorn:
$ sudo systemctl status gunicorn

Найдите в выводе сообщения об ошибках.

  • Проверьте журналы Gunicorn:
$ sudo journalctl -u gunicorn

Nginx не удается запустить или перезагрузить

  • Проверьте конфигурацию Nginx:
$ sudo nginx -t

Эта команда выделит все синтаксические ошибки в ваших конфигурационных файлах.

  • Проверьте журналы Nginx:
$ sudo tail -f /var/log/nginx/error.log

Автоматизация развертывания с помощью конвейера CI/CD

Для больших или часто обновляемых приложений вы можете захотеть автоматизировать процесс развертывания с помощью конвейера непрерывной интеграции/непрерывного развертывания (CI/CD). Это подразумевает настройку таких сервисов, как Jenkins, GitLab CI или GitHub Actions, для автоматического развертывания вашего приложения Flask при каждом внесении изменений в репозиторий.

Настройка базового конвейера CI/CD

  1. Выбор инструмента CI/CD: Jenkins, GitLab CI, GitHub Actions, CircleCI и т. д.
  2. Настройте конвейер: Определите этапы сборки, тестирования и развертывания.
  3. Интеграция с системой контроля версий: Автоматически запускайте развертывание при внесении изменений в репозиторий.

Развертывание с помощью Git Hooks

Если вы предпочитаете более простой подход, вы можете использовать Git-хуки для запуска сценариев развертывания при каждом внесении изменений на сервер.

  1. Создайте на сервере хук после получения изменений:
$ mkdir -p ~/myflaskapp.git/hooks
$ nano ~/myflaskapp.git/hooks/post-receive

Добавьте следующее содержание:

#!/bin/bash
git --work-tree=/home/yourusername/myflaskapp --git-dir=/home/yourusername/myflaskapp.git checkout -f
source /home/yourusername/myflaskapp/venv/bin/activate
pip install -r /home/yourusername/myflaskapp/requirements.txt
sudo systemctl restart gunicorn

Сделайте хук исполняемым:

$ chmod +x ~/myflaskapp.git/hooks/post-receive
  1. Передача обновлений на ваш сервер:

С локальной машины добавьте удаленный репозиторий:

$ git remote add production ssh://username@your_server_ip/home/username/myflaskapp.git

Внесите изменения на рабочий сервер:

$ git push production master

Часто задаваемые вопросы

Какова роль Gunicorn в развертывании Flask?

Gunicorn служит в качестве WSGI HTTP-сервера, который обрабатывает входящие запросы к вашему приложению Flask. Он запускает несколько рабочих процессов для одновременного управления этими запросами, что делает его критически важным компонентом в производственной среде.

Почему Nginx используется в качестве обратного прокси?

Nginx используется в качестве обратного прокси для обработки клиентских соединений, управления статическими файлами и перенаправления динамических запросов в Gunicorn. Это повышает безопасность, производительность и масштабируемость вашего приложения.

Как обеспечить безопасность моего приложения Flask?

Обеспечение безопасности приложения Flask включает в себя использование сертификатов SSL/TLS, применение HTTPS, установку правильных разрешений и регулярное обновление зависимостей сервера и приложения.

Могу ли я использовать другие веб-серверы вместо Nginx?

Да, вы можете использовать другие веб-серверы, например Apache. Однако Nginx предпочтительнее благодаря своей производительности, простоте и удобству использования в качестве обратного прокси.

Что делать, если приложение падает после развертывания?

Проверьте журналы Gunicorn и Nginx, чтобы определить причину сбоя. Убедитесь, что ваше приложение правильно настроено и что все зависимости установлены. Также проверьте наличие синтаксических ошибок в конфигурационных файлах.

Как масштабировать приложение Flask?

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

Заключение

Развертывание приложения Flask с помощью Gunicorn и Nginx на Ubuntu — это мощный способ обеспечить надежность, масштабируемость и безопасность вашего приложения. Следуя шагам, описанным в этом руководстве, вы сможете уверенно развернуть свое приложение Flask в производственной среде. В этом руководстве вы найдете все, что вам нужно знать: от установки сервера и настройки приложения до защиты сайта с помощью SSL и устранения типичных проблем.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *