FastAPI — один из наиболее популярных фреймворков для создания компактных и быстрых HTTP-серверов на Python, выпущенный в 2018 году.
FastAPI основан на нескольких более низкоуровневых библиотеках:
-
Pydantic. Библиотека проверки данных для Python.
-
Starlette. Набор инструментов ASGI (Asynchronous Server Gateway Interface), предназначенный для поддержки асинхронных функций в Python.
В этой статье мы разберемся, как вручную развернуть веб-приложение, написанное с использованием FastAPI, на локальной или удаленной Unix-машине.
Для этого нам понадобится несколько базовых компонентов:
-
Python. Компилятор языка.
-
FastAPI. Пакет для Python.
-
Nginx. Веб-сервер с соответствующим файлом конфигурации.
-
Uvicorn. ASGI-сервер для Python.
-
Systemd. Системная утилита для управления запущенными службами.
Архитектура нашего веб-приложения будет такой:
-
Сперва код на Python с использованием пакета FastAPI запускается в виде ASGI-сервера через веб-сервер Uvicorn
-
Далее запускается Nginx в качестве проксирующего сервера, который будет передавать все поступающие запросы на уже запущенный сервер Uvicorn
-
Оба сервера, Uvicorn и Nginx, будут управляться системной утилитой Systemd
Nginx будет принимать пользовательские запросы с 80 порта (стандартного для HTTP-протокола) и передавать их на 8000 порт (обычно свободный для TCP/UDP-подключений) серверу Uvicorn с приложением FastAPI.
Для развертывания описанного технологического стека нам потребуется либо полноценный выделенный сервер с Unix-подобной операционной системой (например, Ubuntu), либо облачный виртуальный сервер.
Оба типа серверов доступны для аренды в Timeweb Cloud.
VDS и VPS
биллингом по всему миру: Россия, Азия и Европа.
1. Установка Python
Для начала убедитесь, что Python отсутствует в системе:
После этого рекомендуется обновить список доступных для загрузки пакетов:
Далее установим последнюю версию Python и несколько связанных с ним зависимостей — пакетный менеджер, библиотеку с высокоуровневыми типами и модуль для создания виртуальных сред.
Теперь, если запустить Python, откроется интерпретатор:
Для проверки введем простой код и выполним его:
В консоли появится результат выполнения:
2. Установка и конфигурация сервера Nginx
Nginx в нашем примере будет использоваться как «обратный прокси-сервер», который принимает запросы пользователей и отдает их далее на обработку ASGI-серверу Uvicorn в FastAPI-приложение.
Установка
В нашем блоге есть подробная инструкция о том, как установить веб-сервер Nginx на операционную систему Ubuntu.
Сперва обновляется список репозиториев:
Далее выполняется загрузка и установка Nginx:
После этого нужно внести изменения в системный файрвол UFW (Uncomplicated Firewall), сделав доступным 80-й порт для HTTP-соединения:
Конфигурация
Конфигурационный файл nginx.conf расположен в каталоге /etc/nginx/. Мы полностью перезапишем его содержимое, задав минимальные настройки, необходимые для перенаправления запросов на FastAPI:
Обратите внимание, что мы упростили структуру конфигурационных файлов, отказавшись от использования директорий /etc/nginx/sites-available/ и /etc/nginx/sites-enabled/, а также дополнительных файлов из /etc/nginx/conf.d/.
Минимальная конфигурация важна не только для нашего примера. Она также позволяет убрать лишние элементы сервера, не выходя за пределы потребностей проекта. Это повышает безопасность сервера и улучшает понимание его работы.
Кстати, если вы планируете использовать SSL-сертификат на своем сервере, у Timeweb Cloud есть отдельная инструкция по установке SSL-сертификата на Nginx.
Чтобы проверить корректность конфигурационного файла, выполните следующую команду:
Флаг -t предназначен для тестирования файла конфигурации — Nginx анализирует синтаксис и проверяет на существование указанные в файлы. Более подробно о флагах можно узнать в официальной справке.
Так как Nginx работает в фоновом режиме как служба, после установки он уже должен быть запущен. Однако чтобы применить новую конфигурацию, веб-сервер нужно принудительно перезапустить:
Для справки, есть и другая команда, которая перезапускает Nginx, корректно завершая его процессы:
3. Создание простого приложения FastAPI
Директория проекта
Сначала мы создадим папку fastapp под наше FastAPI-приложение в системном каталоге /var, который рекомендуется использовать для размещения файлов веб-серверов:
Далее перейдем в созданный каталог:
Виртуальная среда Python
Теперь создадим локальную изолированную виртуальную среду Python — именно для этого мы предварительно установили пакет python3-venv:
Для активации среды нужно выполнить специальный сценарий, который появился вместе с остальными папками после создания виртуальной среды:
Установка FastAPI
Используя пакетный менеджер pip, мы загрузим и установим библиотеку FastAPI, а также ASGI-сервер Uvicorn:
Теперь мы можем запустить приложение для теста, используя uvicorn. Хост будет размещен локально на стандартном порту:
Разберем немного подробнее эту команду:
-
После флага
--hostмы указываем IP-адрес локального хоста (localhost). -
После флага
--portмы указываем номер свободного порта для TCP/UDP-соединения. Обратите внимание, что это не 80 порт HTTP-протокола. -
Параметр
mainуказывает на название запускаемого модуля. По умолчанию это название python-файла. -
Параметр
appуказывает на экземпляр приложения, который создается внутри кода. -
Флаг
--reloadуказывает Uvicorn самостоятельно отслеживать изменения в исходных файлах и автоматически перезапускать сервер. Этот флаг следует использовать только во время разработки.
Стандартная конфигурация возвращает JSON-объект с сообщением «Hello World». Чтобы убедиться в этом, можно сделать curl-запрос:
Флаг -X здесь равнозначен более длинной форме --request, которая необходима для изменения метода HTTP-запроса на GET.
Код приложения
Откроем файл main.py и заменим его содержимое кодом нашего импровизированного приложения:
Обратите внимание, если вы назовете экземпляр приложения другим именем, тогда и команда Uvicorn будет уже другой вид. Например, вы можете назвать приложение как perfect_router:
В этом случае команда запуска веб-сервера приобретет следующий вид:
Управление через Systemd
Приложение FastAPI должно работать непрерывно, обрабатывая все поступающие запросы. Даже после перезагрузки системы.
Для этого мы задействуем диспетчер процессов systemd, который изначально есть в Linux. Тогда наше FastAPI-приложение станет фоновой службой.
Создадим специальный конфигурационный файл для systemd:
Его содержимое будет следующим:
Обратите внимание, что нужно заменить:
-
ИМЯ_ПОЛЬЗОВАТЕЛЯна имя пользователя в вашей системе -
ИМЯ_ГРУППЫ_ПОЛЬЗОВАТЕЛЕЙна название основной группы пользователей, которым разрешен доступ. Если у вас нет группы, вы можете не указывать опцию «Group» совсем
При этом:
-
Запись
/var/www/fastapp— путь к приложению FastAPI -
Запись
/var/www/fastapp/venv— путь к виртуальной среде
Чтобы рабочий «демон» systemd задействовал новый конфигурационный файл, его нужно перезагрузить:
После этой команды systemd заново загрузить все конфигурационные файлы из директории /etc/systemd/system/, после чего они станут доступны для запуска и мониторинга.
Теперь запустим новую службу через имя, которое мы прописали в файле:
Обратите внимание, что указанное в команде имя службы соответствует названию файла в директории systemd — fastapp.service.
Проверить статус запущенного приложения можно так:
Чтобы включить автоматический запуск приложения при загрузке системы, можно выполнить команду:
4. (Опционально) Использование Supervisor вместо Systemd
Supervisor — это система управления процессами для Unix-подобных операционных систем, в том числе и Linux. Он предназначен для мониторинга и управления запущенными приложениями.
По сути, Supervisor является более продвинутой альтернативой Systemd, однако он не встроен в систему по умолчанию.
Плюсы Systemd:
-
Встроен в ОС. Нет необходимости в другой зависимости
-
Простой в использовании. Не требует обучения, поскольку им можно управлять как системным сервисом
Плюсы Supervisor:
-
Управлять процессами может любой пользователь. Необязательно быть суперпользователем
-
Имеет приятный веб-интерфейс для управления процессами
-
Работает на любом дистрибутиве
-
Больше гибкости в управлении процессами (объединение в группы, установка приоритетов)
Установка Supervisor
Для установки утилиты в систему выполним стандартную команду:
После этого Supervisor будет работать в фоновом режиме и запускаться при каждом старте системы.
Тем не менее, лучше убедиться в том, что функция автозапуска включена. Мы явно воспользуемся стандартным Systemd для включения Supervisor:
После чего вручную запустим его:
Конфигурация службы приложения
Как и в случае с Systemd, нам необходимо написать короткий конфигурационный файл, по которому Supervisor будет управлять нашим сервером Uvicorn.
Файл будет размещен в специальной директории Supervisor, предназначенной для файлов управляемых служб. Как и в случае с Systemd, назовем его fastapp:
Содержимое будет таким:
Разберем написанную конфигурацию чуть подробнее:
-
command. Команда запуска приложения Uvicorn с указанием необходимых флагов и параметров. -
user. Имя пользователя в системе, из под которого будет производиться управление приложением. -
autostart. Автоматический запуск процесса. -
autorestart. Автоматический перезапуск процесса. -
redirect_stderr. Перенаправление вывода ошибок. -
stdout_logfile. Путь до файла, в который будет производиться вывод (в том числе и ошибки) запущенного процесса. Здесь мы указали рабочую директорию проекта, в которой появится отдельная папка под логи.
Так как мы указали в конфигурационном файле специальную директорию для хранения логов, нам необходимо ее явно создать:
Запуск приложения через Supervisor
После добавления нового конфигурационного файла Supervisor должен спарсить его настройки также, как это выполнялось с Systemd. Для этого есть специальная команда:
После обновления конфигурации службу Supervisor нужно дополнительно перезапустить:
Проверить статус запущенного (и управляемого) через Supervisor приложения можно с помощью отдельной команды с указанием имени службы, которая была указана в начале конфигурационного файла:
Разместите проект на FastAPI в Timeweb Cloud
477 ₽/мес
657 ₽/мес
Заключение
В этом небольшом руководстве было показано, как развернуть веб-сайт, в основе которого лежит FastAPI, на удаленной Unix-машине с использованием связки серверов NGINX и Uvicorn, а также утилиты Systemd.
Опционально вы можете использовать более сложный инструмент для мониторинга веб-приложения на FastAPI — Supervisor.
Теперь вы знаете:
-
Как установить Python и основные его зависимости.
-
Как установить и сконфигурировать Nginx для передачи пользовательских запросов Uvicorn-обработчику на FastAPI.
-
Как написать простое приложение на Python с использованием роутеров FastAPI.
-
Как обеспечить непрерывную работу приложения FastAPI в качестве фоновой службы с помощью диспетчера процессов Systemd.
-
Как управлять приложением через отдельную службу Supervisor.
Описанное в этой статье приложение — простой пример, объясняющий механизм развертывания FastAPI-приложения.
В реальном проекте набор инструментов может несколько отличаться. Для организации автоматического процесса развертывания и непрерывной интеграции обновлений (CI/CD) обычно используется оркестратор Kubernetes.
В Timeweb Cloud вы можете воспользоваться кластерами Kubernetes, помогающими в реализации DevOps-подходов в рамках вашего приложения.
