Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Установка сайта на FastAPI (Python) на VDS/VPS без панели управления

7516
12 минут чтения
Средний рейтинг статьи: 4.5

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/, после чего они станут доступны для запуска и мониторинга.

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

    

Обратите внимание, что указанное в команде имя службы соответствует названию файла в директории systemdfastapp.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

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

В этом небольшом руководстве было показано, как развернуть веб-сайт, в основе которого лежит FastAPI, на удаленной Unix-машине с использованием связки серверов NGINX и Uvicorn, а также утилиты Systemd.

Опционально вы можете использовать более сложный инструмент для мониторинга веб-приложения на FastAPI — Supervisor.

Теперь вы знаете:

  • Как установить Python и основные его зависимости.

  • Как установить и сконфигурировать Nginx для передачи пользовательских запросов Uvicorn-обработчику на FastAPI.

  • Как написать простое приложение на Python с использованием роутеров FastAPI.

  • Как обеспечить непрерывную работу приложения FastAPI в качестве фоновой службы с помощью диспетчера процессов Systemd.

  • Как управлять приложением через отдельную службу Supervisor.

Описанное в этой статье приложение — простой пример, объясняющий механизм развертывания FastAPI-приложения.

В реальном проекте набор инструментов может несколько отличаться. Для организации автоматического процесса развертывания и непрерывной интеграции обновлений (CI/CD) обычно используется оркестратор Kubernetes.

В Timeweb Cloud вы можете воспользоваться кластерами Kubernetes, помогающими в реализации DevOps-подходов в рамках вашего приложения.

7516
12 минут чтения
Средний рейтинг статьи: 4.5
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server