Раздел помощи SpaceWeb

Обслуживание приложений Flask с помощью Nginx и Gunicorn в Ubuntu

03 апр, 2024

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

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

Далее мы рассмотрим, как работать в микрофреймворке Flask на сервере Ubuntu.  

Подготовка к работе 

  1. Первое, что вам потребуется – это сервер с установленной ОС Ubuntu и наличием обычного пользователя с правами sudo. В нашем руководстве мы будем использовать сервер с Ubuntu 22.04 LTS. 

Если у вас нет подходящего сервера, то вы можете арендовать его у нас. Аренда сервера в Sweb позволяет настраивать его под свои задачи и сразу получать готовое решение для ваших проектов. 

  1. Далее необходимо инсталлировать веб-сервер Nginx. 
  2. И зарегистрировать домен. 
  3. Настройте записи DNS. О том, как это сделать, мы уже рассказывали в другой статье

Обязательно создайте следующие записи DNS:

  • Запись A с «exampledomain», которая указывает на общедоступный IP-адрес вашего сервера.
  • Запись A с «www.exampledomain», которая указывает на общедоступный IP-адрес вашего сервера.

Установим компоненты из репозиториев Ubuntu

Для начала давайте установим все необходимые компоненты из официальных репозиториев Ubuntu: pip, менеджер пакетов Python, который будет управлять Python-компонентами и так далее. 

  1. Обновите пакеты:
sudo apt update

  1. Установите следующие пакеты, необходимые для создания Python-окружения:
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools

Эти пакеты обеспечат наличие необходимых инструментов и файлов для работы с Python.

  1. Когда система запросит, введите «y».

  1. Дождитесь завершения установки, это может занять пару минут.

Создадим виртуальную среду Python

Теперь настроим виртуальную среду для изоляции приложения Flask от остальных файлов Python в вашей системе. Это обеспечит чистоту окружения и избежание конфликтов зависимостей.

  1. Установите пакет «python3-venv», который включает в себя модуль «venv»:
sudo apt install python3-venv

  1. Введите «y», чтобы продолжить установку.
  2. Создайте родительскую директорию для вашего проекта Flask и перейдите в нее с помощью следующих команд:
mkdir ~/jdproject
cd ~/jdproject

  1. Теперь создайте виртуальную среду, в которой будут храниться зависимости вашего проекта Flask. Выполните следующую команду:
python3 -m venv jdprojectenv

Эта команда установит локальную копию Python и pip в директорию с именем «jdprojectenv» внутри вашего проекта.

  1. Активируйте виртуальную среду с помощью следующей команды:
source jdprojectenv/bin/activate

После активации виртуальной среды рядом с вашим логином появится новое значение: 

«(jdprojectenv) johndoe@srv:~/jdproject$».

Настроим приложение Flask и инсталлируем Gunicorn

Оставайтесь в созданной виртуальной среде Python. Здесь мы установим Flask и Gunicorn, чтобы после начать работу над созданием веб-приложения.

  1. Сначала установите «wheel» с использованием локальной копии «pip»:
pip install wheel

  1. Теперь установите Flask и Gunicorn, которые необходимы для разработки веб-приложения:
pip install gunicorn flask

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

Теперь ваша виртуальная среда настроена и готова к работе с Flask. 

Создадим простое Flask-приложение

Теперь, когда Flask установлен и настроен, давайте создадим простое веб-приложение. 

  1. Откройте редактор nano для создания файла приложения:
nano ~/jdproject/jdproject.py

  1. Вставьте следующий код для создания простого Flask-приложения:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "<h1 style='color:yellow>Hi everyone!</h1>"
if __name__ == "__main__":
    app.run(host='0.0.0.0')

  1. Сохраните и закройте файлы.
  2. Если у вас включен брандмауэр UFW, разрешите доступ к порту 5000:
sudo ufw allow 5000

  1. Введите пароль, когда система того потребует. 
  2. Теперь запустите Flask-приложение для тестирования:
python ~/jdproject/jdproject.py

Вы увидите сообщение о запуске Flask-приложения.

  1. Посетите IP-адрес вашего сервера, добавив «:5000» в адресную строку браузера:
[http://IP_вашего_сервера:5000](http://IP_вашего_сервера:5000)

Приложение должно выдать сообщение «Hi everyone!» желтым цветом.

  1. Когда тестирование будет завершено, нажмите CTRL-C в терминале, чтобы остановить Flask-сервер.

Создадим точку входа WSGI

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

  1. Создайте файл wsgi.py:
nano ~/jdproject/wsgi.py

  1. В этом файле выполните импорт экземпляра Flask из нашего приложения и запустите его:
from jdproject import app
if __name__ == "__main__":
    app.run()

  1. Сохраните и закройте файл по завершении редактирования.

Настроим Gunicorn

Прежде чем продолжить, убедитесь, что Gunicorn может правильно обслуживать ваше приложение.

  1. Для этого передайте ему имя точки входа в приложение. 
  2. Также укажите интерфейс и порт для привязки, используя аргумент 0.0.0.0:5000:
cd ~/jdproject
gunicorn --bind 0.0.0.0:5000 wsgi:app

Вывод будет примерно следующим:

[2023-12-29 23:16:17 +0000] [4885] [INFO] Starting gunicorn 21.2.4
[2023-12-29 23:16:17 +0000] [4885] [INFO] Listening at: http://0.0.0.0:5000 (4885)
[2023-12-29 23:16:17 +0000] [4885] [INFO] Using worker: sync
[2023-12-29 23:16:17 +0000] [4885] [INFO] Booting worker with pid: 4885

  1. Перейдите в браузер и откройте:
http://IP_вашего_сервера:5000

На экране должен отобразиться вывод вашего приложения.

  1. Когда вы подтвердите, что все работает должным образом, нажмите CTRL-C. 
  2. Когда вы закончите использование виртуальной среды, ее можно деактивировать:
deactivate

  1. Создайте файл с расширением .service в директории «/etc/systemd/system». Введите пароль, когда потребуется:
sudo nano /etc/systemd/system/jdproject.service

Это позволит Ubuntu автоматически запускать Gunicorn и обслуживать Flask-приложение при каждом запуске сервера.

  1. Начнем с секции [Unit], где указываются метаданные и зависимости:
[Unit]
Description=Gunicorn instance to serve jdproject
After=network.target

  1. Затем добавьте секцию [Service]. Здесь указываются пользователь и группа, от имени которых должен работать процесс:
[Unit]
Description=Gunicorn instance to serve jdproject
After=network.target
[Service]
User=johndoe
Group=www-data

  1. Затем укажите рабочий каталог и установите переменную окружения PATH, чтобы система инициализации знала, где находятся исполняемые файлы процесса:
[Unit]
Description=Gunicorn instance to serve jdproject
After=network.target
[Service]
User=johndoe
Group=www-data
WorkingDirectory=/home/johndoe/jdproject
Environment="PATH=/home/johndoe/jdproject/jdprojectenv/bin"
ExecStart=/home/johndoe/jdproject/jdprojectenv/bin/gunicorn --workers 3 --bind unix:jdproject.sock -m 007 wsgi:app
 
  1. Наконец, добавьте секцию [Install]:
[Unit]
Description=Gunicorn instance to serve jdproject
After=network.target
[Service]
User=johndoe
Group=www-data
WorkingDirectory=/home/johndoe/jdproject
Environment="PATH=/home/johndoe/jdproject/jdprojectenv/bin"
ExecStart=/home/johndoe/jdproject/jdprojectenv/bin/gunicorn --workers 3 --bind unix:jdproject.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target

Теперь ваш файл systemd готов. 

  1. Сохраните и закройте его.
  2. Запустите Gunicorn и укажите, чтобы он автоматически запускался при загрузке:
sudo systemctl start jdproject
sudo systemctl enable jdproject

  1. Проверьте статус:
sudo systemctl status jdproject

Вы должны увидеть примерно следующий вывод:

●jdproject.service - Gunicorn instance to serve jdproject
     Loaded: loaded (/etc/systemd/system/jdproject.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-12-29 23:33:58 UTC; 1 min 17s ago
   Main PID: 4904 (gunicorn)
      Tasks: 4 (limit: 2191)
     Memory: 51.0M
        CPU: 206ms
     CGroup: /system.slice/jdproject.service
             ├─4904 /home/johndoe/jdproject/jdprojectenv/bin/python3 /home/johndoe/jdproject/jdprojectenv/bin/gunicorn --workers 3 --bind unix:jdproject.sock -m 007 wsgi:app
             ├─4905 /home/johndoe/jdproject/jdprojectenv/bin/python3 /home/johndoe/jdproject/jdprojectenv/bin/gunicorn --workers 3 --bind unix:jdproject.sock -m 007 wsgi:app
             ├─4906 /home/johndoe/jdproject/jdprojectenv/bin/python3 /home/johndoe/jdproject/jdprojectenv/bin/gunicorn --workers 3 --bind unix:jdproject.sock -m 007 wsgi:app
             └─4907 /home/johndoe/jdproject/jdprojectenv/bin/python3 /home/johndoe/jdproject/jdprojectenv/bin/gunicorn --workers 3 --bind unix:jdproject.sock -m 007 wsgi:app
Dec 29 23:33:58 srv systemd[1]: Started Gunicorn instance to serve jdproject.
 

Настройка Nginx

Переходим к настройке веб-сервера Nginx. 

  1. Для начала создайте файл конфигурации в директории «sites-available».
sudo nano /etc/nginx/sites-available/jdproject

  1. В этом файле укажите, чтобы веб-сервер слушал порт 80 и использовал серверный блок для всех запросов вашего домена:
server {
    listen 80;
    server_name jddomain www.jddomain;
}

  1. Далее добавьте блок location, где задайте параметры прокси, включая proxy_params:
server {
    listen 80;
    server_name jddomain www.jddomain;
    location / {
        include proxy_params;
        proxy_pass http://unix:/home/username/jdproject/jdproject.sock;
    }
}

  1. Сохраните файл и примените новую конфигурацию:
sudo ln -s /etc/nginx/sites-available/jdproject /etc/nginx/sites-enabled

  1. Перезапустим Nginx:
sudo nginx -s reload

  1. Завершим настройку, внеся изменения в параметры брандмауэра. Например, правило для доступа через порт 5000 больше не нужно – его можно удалить. Вместо него, добавьте новое правило для открытия подключений к серверу Nginx:
sudo ufw delete allow 5000
sudo ufw allow 'Nginx Full'
  1. Попробуйте открыть ваш сервер в браузере. 

Установим SSL-сертификат

Итак, осталась только установка SSL-сертификата, который обеспечит безопасность передаваемого трафика. Для этой цели рекомендуем воспользоваться бесплатным SSL-сертификатом «Let's Encrypt» с помощью утилиты Certbot. 

  1. Убедитесь, что у вас установлена последняя версия «snapd», выполнив:
sudo snap install core; 
sudo snap refresh core

  1. Если вы ранее устанавливали пакеты Certbot с использованием менеджера пакетов apt, удалите их следующей командой:
sudo apt-get remove certbot

В противном случае установите Certbot через snap:

sudo snap install --classic certbot

  1. Убедитесь, что команда Certbot может быть выполнена:
sudo ln -s /snap/bin/certbot /usr/bin/certbot

  1. Далее пропишите команду, чтобы получить сертификат и автоматически внести необходимые изменения в конфигурацию Nginx:
sudo certbot --nginx

  1. Certbot будет автоматически обновлять сертификат. Вы можете протестировать обновление, запустив команду:
sudo certbot renew --dry-run

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

Заключение

Настройка и обслуживание приложений Flask с использованием Nginx и Gunicorn в Linux (Ubuntu) – это надежное и эффективное решение для развертывания веб-приложений. 

Использование Gunicorn в связке с Nginx обеспечивает высокую производительность и безопасность, а интеграция SSL-сертификата с Certbot добавляет дополнительный уровень защиты. 

В этой статье мы рассмотрели простые шаги по настройке производительной инфраструктуры для ваших Flask-приложений.