Перейти к содержанию

Запуск сервера вручную - Uvicorn

Для запуска приложения FastAPI на удалённой серверной машине вам необходим программный сервер, поддерживающий протокол ASGI, такой как Uvicorn.

Существует три наиболее распространённые альтернативы:

  • Uvicorn: высокопроизводительный ASGI сервер.
  • Hypercorn: ASGI сервер, помимо прочего поддерживающий HTTP/2 и Trio.
  • Daphne: ASGI сервер, созданный для Django Channels.

Сервер как машина и сервер как программа

В этих терминах есть некоторые различия и вам следует запомнить их. 💡

Слово "сервер" чаще всего используется в двух контекстах:

  • удалённый или расположенный в "облаке" компьютер (физическая или виртуальная машина).
  • программа, запущенная на таком компьютере (например, Uvicorn).

Просто запомните, если вам встретился термин "сервер", то обычно он подразумевает что-то из этих двух смыслов.

Когда имеют в виду именно удалённый компьютер, часто говорят просто сервер, но ещё его называют машина, ВМ (виртуальная машина), нода. Все эти термины обозначают одно и то же - удалённый компьютер, обычно под управлением Linux, на котором вы запускаете программы.

Установка программного сервера

Вы можете установить сервер, совместимый с протоколом ASGI, так:

  • Uvicorn, очень быстрый ASGI сервер, основанный на библиотеках uvloop и httptools.
$ pip install "uvicorn[standard]"

---> 100%

Подсказка

С опцией standard, Uvicorn будет устанавливаться и использоваться с некоторыми дополнительными рекомендованными зависимостями.

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

  • Hypercorn, ASGI сервер, поддерживающий протокол HTTP/2.
$ pip install hypercorn

---> 100%

...или какой-либо другой ASGI сервер.

Запуск серверной программы

Затем запустите ваше приложение так же, как было указано в руководстве ранее, но без опции --reload:

$ uvicorn main:app --host 0.0.0.0 --port 80

<span style="color: green;">INFO</span>:     Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
$ hypercorn main:app --bind 0.0.0.0:80

Running on 0.0.0.0:8080 over http (CTRL + C to quit)

Предупреждение

Не забудьте удалить опцию --reload, если ранее пользовались ею.

Включение опции --reload требует дополнительных ресурсов, влияет на стабильность работы приложения и может повлечь прочие неприятности.

Она сильно помогает во время разработки, но не следует использовать её при реальной работе приложения.

Hypercorn с Trio

Starlette и FastAPI основаны на AnyIO, которая делает их совместимыми как с asyncio - стандартной библиотекой Python, так и с Trio.

Тем не менее Uvicorn совместим только с asyncio и обычно используется совместно с uvloop, высокопроизводительной заменой asyncio.

Но если вы хотите использовать Trio напрямую, то можете воспользоваться Hypercorn, так как они совместимы. ✨

Установка Hypercorn с Trio

Для начала, вам нужно установить Hypercorn с поддержкой Trio:

$ pip install "hypercorn[trio]"
---> 100%

Запуск с Trio

Далее запустите Hypercorn с опцией --worker-class и аргументом trio:

$ hypercorn main:app --worker-class trio

Hypercorn, в свою очередь, запустит ваше приложение использующее Trio.

Таким образом, вы сможете использовать Trio в своём приложении. Но лучше использовать AnyIO, для сохранения совместимости и с Trio, и с asyncio. 🎉

Концепции развёртывания

В вышеприведённых примерах серверные программы (например Uvicorn) запускали только один процесс, принимающий входящие запросы с любого IP (на это указывал аргумент 0.0.0.0) на определённый порт (в примерах мы указывали порт 80).

Это основная идея. Но возможно, вы озаботитесь добавлением дополнительных возможностей, таких как:

  • Использование более безопасного протокола HTTPS
  • Настройки запуска приложения
  • Перезагрузка приложения
  • Запуск нескольких экземпляров приложения
  • Управление памятью
  • Использование перечисленных функций перед запуском приложения.

Я расскажу вам больше о каждой из этих концепций в следующих главах, с конкретными примерами стратегий работы с ними. 🚀